东莞市建设质量监督网站,驻马店网站建设维护,公司简介范文(共10篇),中国机械加工网平台为什么会产生死锁 Innodb 引擎为了解决「可重复读」隔离级别下的幻读问题#xff0c;就引出了 next-key 锁。它是记录锁和间隙锁的组合。 Record Lock#xff0c;记录锁#xff0c;锁的是记录本身#xff1b; Gap Lock#xff0c;间隙锁#xff0c;锁的就是两个值之间的… 为什么会产生死锁 Innodb 引擎为了解决「可重复读」隔离级别下的幻读问题就引出了 next-key 锁。它是记录锁和间隙锁的组合。 Record Lock记录锁锁的是记录本身 Gap Lock间隙锁锁的就是两个值之间的空隙以防止其他事务在这个空隙间插入新的数据从而避免幻读现象。 插入意向锁与间隙锁是冲突的所以当其它事务持有该间隙的间隙锁时需要等待其它事务释放间隙锁之后才能获取到插入意向锁。而间隙锁与间隙锁之间是兼容的所以所以两个事务中 select ... for update 语句并不会相互影响。 为什么间隙锁与间隙锁之间是兼容的 间隙锁的意义只在于阻止区间被插入因此是可以共存的。一个事务获取的间隙锁不会阻止另一个事务获取同一个间隙范围的间隙锁共享和排他的间隙锁是没有区别的他们相互不冲突且功能相同即两个事务可以同时持有包含共同间隙的间隙锁。 共同间隙包括两种场景 其一是两个间隙锁的间隙区间完全一样 其二是一个间隙锁包含的间隙区间是另一个间隙锁包含间隙区间的子集。 有一点要注意next-key lock 是包含间隙锁记录锁的如果一个事务获取了 X 型的 next-key lock那么另外一个事务在获取相同范围的 X 型的 next-key lock 时是会被阻塞的。 插入意向锁是什么 插入意向锁是一种特殊的间隙锁但不同于间隙锁的是该锁只用于并发插入操作。 如果说间隙锁锁住的是一个区间那么「插入意向锁」锁住的就是一个点。因而从这个角度来说插入意向锁确实是一种特殊的间隙锁。 插入意向锁与间隙锁的另一个非常重要的差别是尽管「插入意向锁」也属于间隙锁但两个事务却不能在同一时间内一个拥有间隙锁另一个拥有该间隙区间内的插入意向锁当然插入意向锁如果不在间隙锁区间内则是可以的。 插入意向锁的生成时机 每插入一条新记录都需要看一下待插入记录的下一条记录上是否已经被加了间隙锁如果已加间隙锁此时会生成一个插入意向锁然后锁的状态设置为等待状态PSMySQL 加锁时是先生成锁结构然后设置锁的状态如果锁状态是等待状态并不是意味着事务成功获取到了锁只有当锁状态为正常状态时才代表事务成功获取到了锁现象就是 Insert 语句会被阻塞 insert语句是怎么加行级锁的 Insert 语句在正常执行时是不会生成锁结构的它是靠聚簇索引记录自带的 trx_id 隐藏列来作为隐式锁来保护记录的。 什么是隐式锁 当事务需要加锁的时如果这个锁不可能发生冲突InnoDB会跳过加锁环节这种机制称为隐式锁。 隐式锁是 InnoDB 实现的一种延迟加锁机制其特点是只有在可能发生冲突时才加锁从而减少了锁的数量提高了系统整体性能。 如何避免死锁 死锁的四个必要条件互斥、占有且等待、不可强占用、循环等待。只要系统发生死锁这些条件必然成立但是只要破坏任意一个条件就死锁就不会成立。 在数据库层面有两种策略通过「打破循环等待条件」来解除死锁状态 设置事务等待锁的超时时间。当一个事务的等待时间超过该值后就对这个事务进行回滚于是锁就释放了另一个事务就可以继续执行了。在 InnoDB 中参数 innodb_lock_wait_timeout 是用来设置超时时间的默认值时 50 秒。 开启主动死锁检测。主动死锁检测在发现死锁后主动回滚死锁链条中的某一个事务让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on表示开启这个逻辑默认就开启。