MySql 锁的机制(3)----死锁案例
1、不同表相同记录行锁冲突。事务A和事务B操作两张表,但是出现循环等待锁情况。
2、相同表记录行锁冲突。两个job执行数据批量更新,jobA处理的id列表为【1,2,3,4】,而job处理的id列表为【8,9,10,4,2】,这样就造成了死锁。
3、不同索引锁冲突事务A在执行时,除了在二级索引加锁外,还会在聚簇索引上加锁,在聚簇索引上加锁的顺序是【1,4,2,3,5】,洹彭岣啬而事务b执行时,只在聚簇索引上加锁,加锁顺序是【1,2,3,4,5】,这样就造成了死锁的可能性。
4、GAP锁冲突innodb 在RR级别下,如下情况也会产生死锁,比较隐晦。不清楚的同学可以自行根据上节的gap锁原理分析下。
5、如何尽可能的避免死锁。
6、如何查看锁。在INFORMATION_SCHEMA架构下添加了表INNODB_LOCKS、INNODB_LOCK_WAITS,innodb_trx。通过这三张表可以更简疟觥窖捎单的监控当前事务,并分析可能存在的锁问题。select r.trx_id '等待事务ID',r.trx_mysql_thread_id '等待线程ID',r.trx_query '等待事务运行语句',b.trx_id '阻塞事务ID',b.trx_mysql_thread_id '阻塞线程ID',b.trx_query '阻塞事务运行语句'from information_schema.INNODB_LOCK_WAITS wINNER JOIN information_schema.INNODB_TRX bon b.trx_id=w.blocking_trx_idINNER JOIN information_schema.INNODB_TRX ron r.trx_id=w.requesting_trx_id
7、MySql是如何预防死锁的。
8、若存在死锁,通常来说innodb存储引擎选择回滚undo量最小的事务并从新开始。
9、附录。