Hibernate / DB2 -913死锁

时间:2009-08-14 22:52:35

标签: hibernate db2 deadlock

部署在多台计算机上的应用程序 - 访问相同的数据库表。 它读取MIN行,然后删除该行。

如果同时发生这种情况,我们会从DB2中获得-913错误,表示死锁。

已尝试过以下选项 1.锁定行。 2.发生死锁后,在应用程序代码中重新尝试机制。

似乎没什么用。

任何想法/参考/解决方案?

TY

1 个答案:

答案 0 :(得分:1)

检查与SQL0913N关联的原因代码,以确定问题是否实际上是死锁(原因代码2)或只是锁定超时(> 2)。

如果问题确实是死锁,您可以通过激活DB2事件监视器来查找死锁来捕获有关死锁的详细跟踪信息。如果您还没有捕获Hibernate代表您生成的特定语句,您可能还需要定义并激活SQL语句事件监视器以捕获尽可能详细的信息。

Hibernate使用的隔离级别对并发性有很大影响。通常,应用程序在通过Uncommitted Read隔离执行脏读时会遇到较少的锁定,但这种方法并不理想,因为它暴露了未提交的数据并破坏了DB2的ACID属性。如果您已经启用了脏读,那么它可能会导致您的特定问题,因为具有未提交更改的行在其他连接中是可见的,而不是被锁定。

您的应用程序的设计(对实际上是单个工作队列的多线程访问)可能并不理想,并且可能从重构中受益。餐饮哲学家问题提供了各种解决方案模式以减少争用。根据应用程序的具体情况,您可以更改行的处理方式,例如尽早设置状态标志,这将有助于其他线程了解该特定行已被另一个线程处理并可以跳过。也可能对事务边界进行微调,导致更频繁的提交,可以缓解这个问题。

DB2 9.7(2009年6月发布)中一个值得注意的改进是对游标稳定性隔离的增强,该隔离提供对锁定行的当前已提交版本的访问。