Oracle死锁问题
前段时间生产上碰到一个很诡异的问题,某个接口出现超时,里面逻辑很简单,
1.先声明事务,
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition(); defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(defaultTransactionDefinition);
2.操作数据库
UPDATE PRIZE SET HAVE_COUNT = HAVE_COUNT+1,UPDATED_DATE=sysdate WHERE CODE = #{prizeCode} AND AMOUNT > HAVE_COUNT
3.再调用第三方接口,
4.事务提交
问题现象:
该接口上了生产后,经常出现超时,起初怀疑第三方接口慢,但分析日志发现,不是此处引起的超时
复制该条Sql在数据库执行发现,发现跑了很久都没跑完,
然后通过分析执行计划也没发现异常
最后才怀疑是该条数据已经出现了死锁,导致无法更新。。。
重新回顾代码,出现死锁的原因还是来源于这块事务。。