网站建设的案例教程,哪个网站是营销型网站,广州市网络科技有限公司,上海比较好的装修公司排名MySQL锁的分类 全局锁 表级锁 ● 表锁 ● 元数据锁#xff0c;Meta Data Lock#xff0c;MDL锁 ● 意向锁 ● AUTO_INC 锁 行级锁(Innodb引擎牛比的地方) ● record lock#xff0c;记录锁#xff0c;也就是仅仅把一条记录给锁上了 ● gap lock#xff0c;间隙锁#xff…MySQL锁的分类 全局锁 表级锁 ● 表锁 ● 元数据锁Meta Data LockMDL锁 ● 意向锁 ● AUTO_INC 锁 行级锁(Innodb引擎牛比的地方) ● record lock记录锁也就是仅仅把一条记录给锁上了 ● gap lock间隙锁锁定的是一个范围但是不包含记录本身 ● next-key lock临键锁record lock和gap lock的组合锁定一个范围并且锁定记录本身左闭右开。 元数据锁详解 我们不需要显示的使用 MDL锁因为当我们对数据库表进行操作时会自动给这个表加上 MDL锁 如果对一张表进行CRUD操作会申请MDL 读锁 如果对一张表alter table变更表结构的时候申请MDL 写锁 读锁 与 读锁 是共享的 写锁 与 读写 都是互斥的 MDL 不需要显示调用那它是在什么时候释放的? MDL 是在事务提交后才会释放这意味着事务执行期间MDL 是一直持有的。 如果有一个线程A开启了一个长事务(就是迟迟没有提交的事务)这个事务对表加上了 MDL 读锁 然后来了个一个线程B开启了一个新的事务要变更表结构会申请 MDL 写锁读写互斥所以无法申请到 MDL 写锁所以线程B就被阻塞了。 在线程B阻塞后后续所有对该表的select语句都会被阻塞如果这时候恰好有大量的select请求过来就会有大量的线程被阻塞住这时数据库的线程很快就会爆满了。 为什么线程 B 因为申请不到 MDL 写锁而导致后续的申请读锁的查询操作也会被阻塞 这是因为申请 MDL 锁的操作会形成一个队列队列中写锁的优先级高于读锁一旦出现 MDL 写锁等待MDL读锁就申请不到了会阻塞后续该表所有的CRUD操作 所以为了避免上面情况的发生在对变更表结构之前先要看看数据库中的是否有长事务已经对表加上了MDL读锁可以考虑kill掉这个长事务然后再变更表结构。 意向锁详解 ● 在使用 InnoDB 引擎的表里对某些记录加上「共享锁」之前需要先在表级别加上一个「意向共享锁」 ● 在使用 InnoDB 引擎的表里对某些纪录加上「独占锁」之前需要先在表级别加上一个「意向独占锁」 也就是当执行插入、更新、删除操作需要先对表加上「意向独占锁」然后对该记录加独占锁。 而普通的 select 是不会加行级锁的普通的 select 语句是利用 MVCC 实现一致性读是无锁的。 不过select 也是可以对记录加共享锁和独占锁的具体方式如下 //先在表上加上意向共享锁然后对读取的记录加共享锁 select … lock in share mode;
//先表上加上意向独占锁然后对读取的记录加独占锁 select … for update; 为什么要有意向锁呢 前置知识表锁和行锁是满足读读共享、读写互斥、写写互斥的。 如果没有「意向锁」那么加「独占表锁」时就需要遍历表里所有记录查看是否有记录存在独占锁这样效率会很慢。 那么有了「意向锁」由于在对记录加独占锁前先会加上表级别的意向独占锁那么在加「独占表锁」时直接查该表是否有意向独占锁如果有就意味着表里已经有记录被加了独占锁这样就不用去遍历表里的记录。 所以意向锁的目的是为了快速判断表里是否有记录被加锁