【发布时间】:2012-09-28 11:15:38
【问题描述】:
我在我的应用程序中遇到了可重现的 Oracle 死锁。对代码的初步调查并没有发现任何明显的原因,所以我想在记录正在运行的 SQL 以及最重要的是在其中发生的事务时重新创建这种情况。
我开始添加自己的调试语句,但这似乎是我在重新发明轮子,并且已经证明容易出错(我最初错过了我的 EJB 方法之一被定义为“RequiresNew”)
是否有工具可以做到这一点?我看过:
log4jdbc,但从我看到的文档中并不清楚 将记录单独的事务,而且它不支持 数据源,所以我需要解决这个问题。
jdbcslog - 也不清楚它是否会记录事务
或者我错过了一些更明显的方法来做到这一点?
【问题讨论】:
-
您查找的原因是什么?
-
两个独立的事务,以不同的顺序锁定相同的资源(行)。即事务 1 更新 a 行,事务 2 更新 b 行,然后事务 1 尝试更新 b 行,但由于事务 2 已经拥有它而等待,事务 2 尝试更新 a 行并等待,因为事务 1 已经拥有它。宾果 - 僵局。我一直在寻找这种场景,然后寻找更复杂的、跨越更多资源的场景。
-
您设置的隔离级别是多少?可序列化?
-
老实说,我处理这类事情的方式是将所有内容记录到一个平面文件中并进行挖掘。老式的,我知道。它唯一的优点是它有效。分享和享受。
-
数据库本身在各种视图中公开锁信息。对于普通开发人员来说,这有点涉及,但 Oracle DBA 应该能够为您提供信息。具体来说,正在等待什么、锁定什么以及由谁锁定。
标签: java oracle jboss database-deadlocks