Loading... 死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象.当多个事务试图以不同顺序锁定资源时,就可能会产生死锁.多个事务同时锁定同一个资源时,也会产生死锁.例如,摄像下面两个事务同时处理StockPrice表: 事务1 START TRANSACTION; UPDATE StockPrice SET high = 5 WHERE stock_id = 3; UPDATE StockPrice SET high = 10 WHERE stock_id = 4; COMMIT; 事务2 START TRANSACTION; UPDATE StockPrice SET high = 20 WHERE stock_id = 4; UPDATE StockPrice SET high = 30 WHERE stock_id = 3; COMMIT; 如果凑巧,两个事务都执行了第一条UPDATE语句,更新了第一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条UPDATE语句,却发现该行已经被对方锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环.除非有外部因素接入才可能解除死锁. 为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制.越复杂的系统,比如InoDB储存引擎,越能检测到死锁的依赖循环,并立即返回一个错误.这种解决方式很有效,否则死锁会导致出现非常慢的查询.还有一种解决方式,就是当查询的时间达到锁等待超时的设定后放弃锁请求,这种方式通常来说不太好.InnoDB目前处理死锁的方式是,将持有最少行级排他锁的事务进行回滚(这是相对比较简单的死锁回滚方式). 锁的行为和顺序是储存引擎相关的.以同样的顺序执行语句,有些储存引擎会产生死锁,有些则不会.死锁的产生有双重原因:有些是因为真正的数据冲突,这种情况通常很难避免,但有些则完全是犹豫储存引擎的实现方式导致的. 死锁发生后,只有部分或者完全回滚其中一个事务,才能打破死锁.对于事务型的系统,这是无法避免的,所以应用程序在设计时必须考虑如何处理死锁.大多数情况下只需要重新执行因死锁回滚的事务即可. 最后修改:2021 年 03 月 07 日 10 : 54 AM © 允许规范转载 赞赏 随便看看就好,打赏个一毛两毛也不错 赞赏作者 支付宝微信