2010-01-29 158 views
4

我有一个遭受数据库死锁的集群应用程序。如何避免数据库死锁

这是一个使用JPA和hibernate的j2ee应用程序。数据库是Z/OS上的DB2 8.1被设置为页面锁定(这是公司的一项要求)。

问题是主键是作为一个序列生成的,并且在尝试插入记录时通常会死锁,如果系统有任何重大负载。

是否有减少死锁概率的“最佳实践”?

+0

后续操作:执行随机数建议后,死锁率大幅下降。感谢所有的帮助。 – Jesse 2010-02-08 20:54:23

回答

6

“是否有任何”最佳实践“来减少死锁的可能性?”

死锁意味着2个(或更多)进程,2个(或更多)资源和两个不同的访问命令。

过程1具有获得A和B

过程2具有以获得B和等候A.

如果每个进程将得到的第一,死锁的发生率降低。

由于您在整个页面上发生死锁,因此很难确保每个人都获得相同的页面来开始他们的交易。

您可以尝试通过确保页面之间的行被广泛搅乱来减少冲突。

您可以尝试通过引入一个“您必须首先获取”行来减少冲突,这将有效地实现单线程应用程序。

+0

有没有办法确保行将被分发?我不知道数据库如何确定哪一页粘贴该行(我假设它是基于关键字)。将另一个字段添加到随机数(或UUID)的密钥是否有助于分配行? – Jesse 2010-01-29 20:19:33

+0

@Jesse:UUID可能是足够随机的。你有随机数发生器是非常随机的。你也可以通过一些与引起碰撞的属性不同的属性进行索引。邮政编码,例如。 – 2010-01-29 20:29:05