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资源的。