【问题标题】:How to avoid database deadlocks如何避免数据库死锁
【发布时间】:2016-08-14 05:29:51
【问题描述】:

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

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

问题是主键是作为一个序列生成的,如果系统负载很大,在尝试插入记录时经常会死锁。

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

【问题讨论】:

  • 跟进:实施随机数建议后,死锁大大减少。感谢所有帮助过的人。

标签: java concurrency db2 deadlock


【解决方案1】:

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

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

进程 1 必须得到 A 和 B。

进程 2 必须获得 B 并等待 A。

如果每个进程都首先获得A,那么死锁的发生率就会降低。

由于您在整个页面上陷入僵局,因此很难确保每个人都获得相同的页面来开始他们的事务。

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

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

【讨论】:

  • 有没有办法确保行将被分布?我不确定数据库如何确定将行插入的页面(我假设它基于密钥)。将另一个字段添加到作为随机数(或 UUID)的键中是否有助于分配行?
  • @Jesse:UUID 可能足够随机。你有非常随机的随机数生成器。您还可以通过某些与导致冲突的分布不同的分布来索引。例如邮政编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2013-06-07
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多