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在数据库执行发现,发现跑了很久都没跑完,

然后通过分析执行计划也没发现异常

最后才怀疑是该条数据已经出现了死锁,导致无法更新。。。

重新回顾代码,出现死锁的原因还是来源于这块事务。。

posted @ 2020-04-30 09:46  朗如风9011  阅读(196)  评论(0)    收藏  举报