概念

死锁是指两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

  • 当多个事务试图以不同顺序锁定资源时,就可能会产生死锁;
  • 多个事务同时锁定同一个资源时,也会产生死锁;

示例

设想如下两个事务同时处理 StockPrice 表:

image.png

  • 若两个事务都执行第一条 UPDATE 语句,更新了一行数据,同时也锁定了该行数据;
  • 接着每个事务都尝试去执行第二个 UPDATE 语句,却发现该行已经被对方锁定;
  • 然后两个事务都在等待对方释放锁,同时又持有对方需要的锁,则陷入了死循环。除非有外部因素介入才能解除死锁。

如何解决

  • 数据库系统实现了各种死锁检测和死锁超时机制。
  • 越复杂的系统,如:InnoDB 存储引擎,越能检测到死锁的循环依赖,并立即返回一个错误。
    • InnoDB 处理死锁的方式是:将持有最少行级排它锁的事务进行回滚
  • 死锁会导致非常慢的查询
  • 其他方法:当查询的时间到达所等待超时的设定后放弃所请求(一般不推荐)

死锁发生后,只有部分或完全回滚其中一个事务,才能打破死锁。