转自高性能mysql;
【1.3.2】死锁
1)死锁定义:指两个或多个事务在同一资源上相互占用, 并请求锁定对方占用的资源,从而导致恶性循环的现象;
当多个事务试图以不同顺序锁定资源时,就可能产生死锁;多个事务同时锁定同一个资源时,也会产生死锁;
2)死锁解决方法
- 方法0)数据库系统实现了各种死锁检测和死锁超时机制;
- 方法1)innodb处理死锁的方法是:将持有最少行级排他锁的事务进行回滚;
- 方法2)死锁发生后,只有部分或完全回滚其中一个事务,才能打破死锁;
【死锁荔枝】如下面两个事务同时处理 stock_tbl 表:
事务1:
start transaction;
update stock_tbl set close = 11.11 where stock_id = 4 and date = '2018-07-24';
update stock_tbl set close = 22.22 where stock_id = 3 and date = '2018-07-25';
commit;
事务2:
start transaction;
update stock_tbl set high = 33.33 where stock_id = 3 and date = '2018-07-25';
update stock_tbl set high = 44.4 where stock_id = 4 and date = '2018-07-24';
commit;
假设这样一种情况: 两个事务都执行了第1条update语句, 更新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第2条update语句, 却发现该行数据已经被对方锁定,
然后两个事务都等待对方释放锁,同时又持有对方需要的锁,故事务1和事务2陷入了死循环。除非有外部因素介入,才可能解除死锁;