2009-08-14 74 views
1

部署在多台机器上的应用程序 - 访问相同的数据库表。 它读取MIN行,然后删除该行。Hibernate/DB2 -913死锁

当发生这种情况的同时,我们从DB2标志着僵局-913错误。

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

似乎没有任何工作。

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

TY

回答

1

请与您的SQL0913N相关的原因代码,以确定该问题实际上是一个僵局(原因码2)或只是锁定超时(> 2)。

如果问题真的是一个僵局,您可以通过激活DB2事件监视器死锁获取有关死锁的详细的跟踪信息。如果您尚未捕获由Hibernate代表生成的特定语句,则可能还需要定义和激活SQL语句事件监视器以捕获尽可能多的细节。

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

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

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