mysql中行锁(mysql每日一讲)

                                           mysql中的行锁

InnoDB是支持行锁的,粒度更小。
什么是行锁,保证多个线程同一时刻只能有一个线程操作这一行记录。

两阶段锁
在InnoDB中,行锁是在需要的时候加上的,但并不是不需要了就里面释放,而是在事务结束后释放。
如果你的事务中需要锁多行,要把最可能造成锁冲突的锁放后面。

结论,只有等事务A完全执行完之后才可以执行事务B
这就是两阶段锁。


死锁

结论:事务A拿着id=1的行锁,事务B拿着id=2的行锁,(注意这俩长事务中并不是上面将的两阶段锁),之后事务A在等待事务B给他id=2的行锁,而事务B在等待id=1的行锁,两个互不相让,造成死锁。

kettle中一个转换里面并行运行一堆针对一个表的update就容易死锁。

死锁检测(5.7之后才默认开启自动检测的)

对于死锁的两种处理措施
(1)超时,默认死锁超时是50秒,超过这个时间直接报错,解锁。
(2)死锁检测(InnoDB默认是开启的),发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务继续可以执行。这个在mysql5.7中才加入的死锁自动检测,所以现在我使用的5.6版本还是会出现死锁。

  • innodb_deadlock_detect=on     自动打开死锁检测

第二种死锁检测是需要消耗CPU资源的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值