mysql锁争用_mysql 开发进阶篇系列 7 锁问题(innodb锁争用情况及锁模式)

1 .获取innodb行锁争用情况

1.1 通过检查innodb_row_lock状态变量来分析系统上的行锁的争夺情况

SHOW STATUS LIKE 'innodb_row_lock%'

aa7f116667b752d95dc9ce3ec93b80c7.png

通过innodb_row_lock_waits 和 innodb_row_lock_avg 的值来判断行锁争用情况,值高意味着争用比较严重。

1.2 通过检查 innodb monitors来观察发生锁冲突的表,数据行等,并分析锁争用的原因

--查看分析

SHOW ENGINE INNODB STATUS;

status内容中会详细说明当前锁等待的信息,包括表名,锁类型,锁定记录的情况等,以便进行进一步的分析和问题的确定。以后在详细分析

9f8460f2ff0dda2dc7ea75f4797ad9d0.png

2. innodb 行锁模式及加锁方法

两种锁模式(类型)共享锁, 排它锁。

共享锁(S):允许其它事务读取该行数据,阻止其它事务获取排他锁去更新。

排它锁(x): 阻止其它事务读取或更新。

为了允许行锁和表锁共存,实现多粒度锁机制,innodb内部使用意向锁,这二种意向锁都是表锁。

意向共享锁(IS): 当前事务打算给数据行加S锁,必须先取得该表的IS锁。

意向排它锁(IX): 当前事务打算给数据行加x锁,必须先取得该表的IX锁。

下图是innodb 行锁模式兼容性列表

003b36b493984295e37a80cb9b849361.png

通过上图可以总结出来: S与IS锁在事务与事务之间是兼容的。 ix锁与(ix锁或is锁)在事务与事务之间是兼容的。 is锁与(IX,S,IS锁)是兼容的。X锁与其它锁是互斥的。

当事务将要获取的锁与其它事务的锁兼容时,就会授予该事务锁,否则该事务就要等待其它事务锁的释放。

对于update,delete,insert语句,innodb会自动给涉及的数据集加X锁(对于delete,update会先加S锁再升级为X锁)。

对于普通的select语句innodb会加S锁。

3. 语句级加锁

lock in share mode(语句集上加IS锁)

在select 语句最后加上lock in share mode相当于手动加上共享锁。确保当前没有人对该记录进行update或delete操作。

for update(语句集上加IX锁)

select for update是对锁定行记录后,需要进行更新操作的应用。

(未完)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值