记一次Oracle数据库的死锁
现象描述
代码报错:
ORA-00060: deadlock detected while waiting for resource
一看是死锁,心里又惊又喜。我还没遇到过死锁呢,听说很难搞,正因为难搞才有意思啊,哈哈。
原因定位
通过查日志,查数据库,发现有两个事务(A,B)同时去更新数据库里同样的几条数据(1,2,3)。
此时如果事务A拿到了数据1的锁,事务B拿到了数据2的锁。事务A想要去更新数据2,事务B想要去更新数据1,这样A,B就产生了死锁。但是查日志发现事务A是成功的。这就奇怪了,为什么单就B失败了呢?明明A也产生了死锁啊。
原来当Oracle检测到死锁时就会牺牲掉某一方,从而让另一方继续执行,至于以什么依据来牺牲掉一方,我还没查到。。。
解决方案
优化了业务,让事务B只更新一条数据,所以B最多只能拥有一把锁,从而避免了死锁。