部署在多台计算机上的应用程序 - 访问相同的数据库表。 它读取MIN行,然后删除该行。
如果同时发生这种情况,我们会从DB2中获得-913错误,表示死锁。
已尝试过以下选项 1.锁定行。 2.发生死锁后,在应用程序代码中重新尝试机制。
似乎没什么用。
任何想法/参考/解决方案?
TY
答案 0 :(得分:1)
检查与SQL0913N关联的原因代码,以确定问题是否实际上是死锁(原因代码2)或只是锁定超时(> 2)。
如果问题确实是死锁,您可以通过激活DB2事件监视器来查找死锁来捕获有关死锁的详细跟踪信息。如果您还没有捕获Hibernate代表您生成的特定语句,您可能还需要定义并激活SQL语句事件监视器以捕获尽可能详细的信息。
Hibernate使用的隔离级别对并发性有很大影响。通常,应用程序在通过Uncommitted Read隔离执行脏读时会遇到较少的锁定,但这种方法并不理想,因为它暴露了未提交的数据并破坏了DB2的ACID属性。如果您已经启用了脏读,那么它可能会导致您的特定问题,因为具有未提交更改的行在其他连接中是可见的,而不是被锁定。
您的应用程序的设计(对实际上是单个工作队列的多线程访问)可能并不理想,并且可能从重构中受益。餐饮哲学家问题提供了各种解决方案模式以减少争用。根据应用程序的具体情况,您可以更改行的处理方式,例如尽早设置状态标志,这将有助于其他线程了解该特定行已被另一个线程处理并可以跳过。也可能对事务边界进行微调,导致更频繁的提交,可以缓解这个问题。
DB2 9.7(2009年6月发布)中一个值得注意的改进是对游标稳定性隔离的增强,该隔离提供对锁定行的当前已提交版本的访问。