Mysql的锁及相关机制

mysql innodb支持的锁类型

排他/共享锁(Share and Exclusive Locks)

共享锁(share Locks):共享锁之间不互斥,但是共享锁和排他锁之间互斥(S锁)
排他锁(exclusive Locks):排他锁和任何锁都互斥(X锁)

意向锁 (Intention Locks)

innodb 为了支持多粒度锁机制(multiple granularity locking)及行级锁和表级锁,而引入意向锁概念,意向锁是指在将来某个时刻事务要添加共享/排他锁,意向锁是一个表级锁(table-level locking),意向锁之间相互兼容

意向锁主要用来标志底层资源是否被使用,例如:一个更新语句先在表(上层资源)上添加意向锁,然后在更新的记录上(底层资源)添加写锁;这个时候第二个更新表结构的语句先判断表上的意向锁,就不需要再判断行的写锁或读锁是否存在了。

在事务申请读写锁之前先申请对应的意向锁。
X锁对应IX锁
S锁对应IS锁

  • 意向共享锁(Intention share locks[IS]):事务要对表添加共享IS锁
  • 意向排他锁(Intention Exclusive Locks[IX]):事务要对表添加排他IX锁
select  ... lock in share mode;  添加共IS锁
select  ... for udpate; 添加IX锁,有索引的情况下添加行锁

事务要获取某些记录的S/X锁之前,先获取对应表的IS/IX锁,意向锁之间相互兼容

是否互斥 IS IX
IS
IX

意向锁和共享互斥锁之间的关系

是否互斥 S X
IS
IX

间隙锁 (Gap Locks)

封锁记录中间的数据,或者是第一条索引之前的范围,或者是最后一条索引之后的范围,

select * from lock_example where id between 0  and 10 for udpate;

可以防止在0到10之间插入数据,如果将事务降级到(read commit RC)该锁会失效

记录锁 (Record Locks)

锁定具体的表中的记录,在获取记录锁的过程中应该是先获取意向锁在说去对应记录了的读写锁。

临键锁 (Next-key Locks)

临键锁是记录锁和间隙锁的组合,大于记录所小于间隙锁的范围。
临键锁锁定的是记录锁对应的索引对应的间隙拆分,然后分别加锁。
例如:记录锁对应的索引有:10、11、13、20,其对应的间隙锁如下:
(negative infinity, 10],(10,11],(11,13],(13,20],(20,positive infinity)
默认情况下在RR隔离级别上生效,主要用来防止幻读

插入意向锁 (Insert Intention Locks)

插入意向锁是INSERT操作之前进行的间隙锁定,如果一个INSERT操作获取到了一个相同的间隙,如果这两个INSERT操作没有放在相同的索引位置,则不需要对彼此进行等待。
例如:当两个INSERT操作锁定了4,7索引的间隙,事务1插入索引5,事务2插入索引6则这两个操作可以同时进行

自增所 (Auto-inc Locks)

在自增插入时才会使用到该锁,innodb_autoinc_lock_mode配置可以用来平衡
生成自增数据量和插入数据的并发量。

不同的数据库隔离级别锁之间会表现不同的行为

  • 读取未提交内容(read uncommitted):最低级别的隔离级别,未提交内容也可以被读取到,会出现脏读(Dirty Read),该隔离级别没有明显的性能优势。

  • 读取提交内容(read committed):不是Mysql默认隔离级别,一个事务只能看到已提交事务所作的改变及一个事务中的select结果集会有不同。

  • 可重复读(repeatable read):msyql数据库的默认隔离级别,该隔离级别可以确保同一个事务中的相同的select语句可以获取到相同的查询结果。但是该该隔离级别会导致幻读(Phantom Read)问题,及该隔离级别的查询当进行范围查询时另一个事务如果新增了一条记录,则该记录会被查询出来。Mysql的innodb使用多版本并发控制(MVCC multiversion concurrency control)解决了这个问题。

  • 串行化(Serilizable):最高级别的隔离级别,将所有的事务强制串行化

查看死锁日志(Mysql Innodb引擎)

show engine innodb status\G;

参考:
https://www.aneasystone.com/archives/2017/10/solving-dead-locks-one.html
https://www.jianshu.com/p/996236d91048
https://blog.csdn.net/dreamvyps/article/details/84500543

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容