数据库死锁_死锁荔枝_解决方法

转自高性能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陷入了死循环。除非有外部因素介入,才可能解除死锁;

猜你喜欢

转载自blog.csdn.net/PacosonSWJTU/article/details/81193395
今日推荐