概念
死锁是指两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
- 当多个事务试图以不同顺序锁定资源时,就可能会产生死锁;
- 多个事务同时锁定同一个资源时,也会产生死锁;
示例
设想如下两个事务同时处理
StockPrice
表:
- 若两个事务都执行第一条 UPDATE 语句,更新了一行数据,同时也锁定了该行数据;
- 接着每个事务都尝试去执行第二个 UPDATE 语句,却发现该行已经被对方锁定;
- 然后两个事务都在等待对方释放锁,同时又持有对方需要的锁,则陷入了死循环。除非有外部因素介入才能解除死锁。
如何解决
- 数据库系统实现了各种死锁检测和死锁超时机制。
- 越复杂的系统,如:InnoDB 存储引擎,越能检测到死锁的循环依赖,并立即返回一个错误。
- InnoDB 处理死锁的方式是:将持有最少行级排它锁的事务进行回滚
- 死锁会导致非常慢的查询
- 其他方法:当查询的时间到达所等待超时的设定后放弃所请求(一般不推荐)
死锁发生后,只有部分或完全回滚其中一个事务,才能打破死锁。