电子商务网站硬件建设的核心前几年做那个网站致富

当前位置: 首页 > news >正文

电子商务网站硬件建设的核心,前几年做那个网站致富,.net和php那个做网站好,提升审美的网站一、锁的介绍 锁是计算机协调多个进程或者线程并发访问某一资源的机制。那么如何保证数据并发访问的一致性、有效性是数据库必须解决的一个问题#xff0c;锁的冲突也是影响数据库并发访问性能的一个重要因素#xff0c;所以数据库中锁的应用极为重要#xff0c;其复杂度也更…一、锁的介绍 锁是计算机协调多个进程或者线程并发访问某一资源的机制。那么如何保证数据并发访问的一致性、有效性是数据库必须解决的一个问题锁的冲突也是影响数据库并发访问性能的一个重要因素所以数据库中锁的应用极为重要其复杂度也更高。 锁的分类以锁的颗粒度为三类 全局锁锁定数据库中的所有表。 表级锁每次操作锁住整张表。 行级锁每次操作都锁到对应行的数据。 接下来就分别对这几种锁做一个解释。 二、全局锁 1、概念 对整个数据库实例加锁加锁后整个实例就处于只读状态对于后面的DML语句DDL语句已经更新操作的事务提交语句都会被阻塞。 典型的场景应用数据备份。对所有的表进行锁定从而获取数据的一致性保证数据的完整性。 如图所示我们加了全局锁之后使用mysqldump取备份数据的时候其他客户端的事务是不能执行DML操作、DDL操作的但可以执行DQL操作当我们备份好数据后导出xxx.sql文件后再解开锁此时DML操作、DDL操作才生效。 其中DML操作是指对数据进行增加、删除、修改操作。DDL操作是指主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。DQL操作是指对数据进行查询操作。还有DCL操作是指主要是用来设置/更改数据库用户权限。 2、语句 加锁flush tables with read lock; 解锁unlock table 3、不足 ①如果在主库上备份那么备份期间都不能执行更新业务基本上就停摆了 。 ②如果在从库上备份那么在备份期间不能执行同步过来的二进制日志洗会导致延迟。 二、表级锁 对于表级锁锁定粒度答发生锁冲突的概率 最高并发度低。应用在MyISAM、InnoDB、BDB等存储引擎中。 表级锁分为表锁、元数据锁、意向锁三类。 1、表锁 1表共享读锁read lock 如图所示有两个客户端Client1、Client2当Client1执行加锁操作后Client1、Client2都只能执行DQL操作不能执行DDL/DML操作进行堵塞。只有当Client1解锁后才能恢复DDL/DML的操作。 2表独占写锁write lock) 如图所示有两个客户端Client1、Client2当Client1执行加锁操作后Client1对该表能读能写Client2不能执行DQL操作和不能执行DDL/DML操作进行堵塞。只有当Client1解锁后才能恢复Client2的DQL/DDL/DML的操作。 3语法 加锁lock tables 表名 read/write。 释放锁unlock tables / 客户端断开。 2、元数据锁MDL 元数据锁加锁过程是系统自动控制的无需显示使用主要作用是为了维护表元数据的一致性。 在表中若有未提交的事务不可以对元数据进行写入操作。 对表进行增删查改的时候加入MDL读锁共享 对表结构进行变更操作的时候加入MDL写锁排他。 MDL的读锁分为类型分为shared_read(执行select、select xxx lock in share mode 触发)、shared_write(执行insert、update、delete、select…for update 触发)。 ①读锁之间是兼容的 如图所示两个客户端Client1、Client2当这两个客户端执行CRUD操作的时候系统就自动添加了MDL的读锁而读锁之间是不排斥的所以Client1与Client2对User表的操作不会造成堵塞。 ②读锁与写锁排斥、写锁与写锁排斥 如图所示两个客户端Client1、Client2,假设Client1执行了DQL操作那么此时系统产生了MDL读锁如果这时我们的Client2执行DDL操作就会被堵塞因为DDL操作产生的是MDL的写锁会与MDL的写锁排斥。此时只有Client1commit提交后Client2的语句才会生效。 3、意向锁 为了避免DML在执行时加的行锁与表锁的冲突在InnoDB中引入了意向锁使得表锁不用检查 每行数据是否加锁使得意向锁来减少表锁的检查。 如图所示当我们Client1执行一个update语句的时候我们的mysql 会默认对更新的行加上行锁 若此时没有意向锁且Client2想对整张表进行锁表操作那么Client2就会从第一条记录开始一条条查找对应行有没有行锁找到行锁后在判断该行锁类型与添加的表锁是否冲突再决定是否加锁现实这个过程效率很低。 假如我们加了意向锁如图所示此时Client1执行上诉同样的操作而Client2在执行使先 判断当前的意向锁 与表锁是否兼容若兼容直接加锁若不兼容则Client2的操作会阻塞直到Client1进行了commit操作且释放意向锁和行锁后才生效。此时不用逐行检查行锁的情况效率增加。 意向锁分为两类意向共享锁IS和意向排他锁IX两类接下来做以下介绍。 1意向共享锁IS 意向共享锁与表锁的表共享读锁read兼容与表独占写锁(write)排斥。 语句select … select语句lock in share mode(触发) 如图所示Client1先通过select … select语句lock in share mode触发意向共享锁IS,此时Client2执行锁表的read lock操作可以直接锁表因为二者兼容当 执行锁表的wirte lock此操作则会被堵塞因为二者不兼容。 2意向排他锁IX 意向排他锁与表共享读锁(write)、表独占写锁(read)都互斥。意向锁之间不会互斥。 语句insert 、update、delete、select … for update触发 如图所示Client1通过insert 、update、delete、select … for update语句 触发意向排它锁IX,此时Client2执行表共享读锁(write)、表独占写锁(read)都会被互斥因为不兼容只有等Client1执行完毕提交后Client2的指令才会触发。 三、行级锁 行级锁是MySQL 中锁定粒度最小的一种锁是针对索引字段加的锁只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小并发度高但加锁的开销也最大加锁慢会出现死锁。应用在Innodb储存引擎中。 行级锁分为行锁Recode Lock、间隙锁 Gap lock、临键锁 (Next-key Lock:行锁与间隙锁的组合)三类接下来分别介绍。 1、行锁 行锁分为共享锁和排他锁两类。 1共享锁s 只允许一个事务去读一行阻止其他事务获得相同的数据集的排它锁。共享锁之间兼容与排它锁之间排斥 语句select … select语句lock in share mode 触发select 不加锁 2排他锁(x) 允许获取排它锁的事务更新数据阻止其他事务获得相同数据集的共享锁和排他锁排它锁与排它锁、共享锁之间都冲突阻止其他事务的读锁和写锁
语句insert 、update、delete、select … for update 触发 2、间隙锁 间隙锁唯一的目的就是防止其他事务插入间隙。造成幻读现象。 如图所示Client1执行了一个update Student set age 10 where id5操作此时因为表中没有id5的字段此时就会在id7和id3之间加一个间隙锁不包含id3和id7的情况此时Client2又执行了一个insert Student values(6,李蛋,6)指令在id3和id7之间插入一条指令因为加了间隙锁所以插入操作会被阻塞直到Client1完成commit提交后Client2插入语句才会生效。 3、临键锁 临键锁是记录锁与间隙锁的组合它的封锁范围既包含索引记录又包含索引区间。默认情况下InnoDB在Repeatable Read事务隔离级别运行InnoDB使用临键锁进行搜索和索引扫 描以防止幻读。临键锁与间隙锁相比除了锁住当前记录也会锁定当前记录之前的一部分间隙 四、再谈乐观锁与悲观锁 我们从mysql模式上分类来谈谈乐观锁与悲观锁这两种思想。 1、乐观锁 1概念 乐观锁是一种在数据库操作中用于处理并发问题的技术。它的思想是认为数据一般情况下不会造成冲突所以在数据进行提交更新的时候才会正式对数据的冲突与否进行检测如果发现冲突了则让返 回错误信息让用户决定如何去做。 2实现 利用数据版本号version机制是乐观锁最常用的一种实现方式。一般通过为数据库表增加一个数字类型的 “version” 字段当读取数据时将version字段的值一同读出 数据每更新一次对此version值1。当我们提交更新的时候判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对如果数据库表当前版本号与第 一次取出来的version值相等则予以更新否则认为是过期数据返回更新失败。 3应用场景 ①低冲突环境。②读多写少的场景。③ 短事务场景。④互联网应用。⑤分布式应用。 4缺点 ①冲突检测在高并发的环境中乐观锁可能会导致大量的冲突 。 ②处理开销在处理冲突时需要执行回滚和重试这可能会增加系统的开销。 ③版本管理乐观锁通常通过版本号或时间戳来检测冲突。这要求系统能正确的控制版本号否则可能导致错误的版本冲突。 2、悲观锁 1概念 悲观锁是指数据在操作数据的时候比较悲观每次去拿数据的时候认为别的线程也会同时修改数据所以在每次拿数据的时候都会加锁这样别的线程想要拿数据就会被阻塞直到它解开锁。 2实现 ①使用select…for update是MySQL提供的实现悲观锁的方式。 ②Java中使用synchronized和ReentrantLock等独占锁方式实现。 3应用场景 ①写操作比较多的场景。②并发冲突高的场景。③业务需要强一致性的的场景。 4缺点 ①需要实施阻塞导致效率降低下。 ②可能造成某个线程永久等待即发生死锁的可能性较大。 ③锁超时如果一个事务长时间有锁而不被释放可能导致其他等待锁的事务超时。 五、总结 这里博主整理我们常见的MySQL中锁的概念还介绍了面试中 常问的关于乐观锁、悲观锁的 一些特点。相信一定对屏幕前正在阅读的小伙伴有所帮助大家不要忘记点赞、关注支持博主一波哦后续还有更多内容与大家分享~