gpt4 book ai didi

java - 多线程——避免和处理数据库死锁

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:38 24 4
gpt4 key购买 nike

我正在寻找一种在 Java 6 应用程序中处理数据库死锁的好策略;多个并行线程可能同时写入同一个表。如果数据库 (Ingres RDMBS) 检测到死锁,它将随机终止其中一个 session 。

如果满足以下要求,处理死锁情况的可接受技术是什么?

  • 应该保留总耗时尽可能小
  • 终止一个 session 会导致显着(可衡量)回滚
  • 时间线程没办法
    相互沟通,即策略应该是自主的

到目前为止,我想出的策略是这样的:

short attempts = 0;
boolean success = false;
long delayMs = 0;

Random random = new Random();
do {
try {
//insert loads of records in table 'x'
success = true;
} catch (ConcurrencyFailureException e) {
attempts++;
success = false;
delayMs = 1000*attempts+random.nextInt(1000*attempts);

try {
Thread.sleep(delayMs);
} catch (InterruptedException ie) {
}
}
} while (!success);

有什么可以改进的吗?例如等待固定数量(魔数(Magic Number))的秒数。是否有不同的策略会产生更好的结果?

注意:将使用多种数据库级技术来确保死锁在实践中非常罕见。此外,应用程序将尝试避免调度同时写入同一个表的线程。上述情况只是“最坏情况”。

注意:插入记录的表是堆分区表,没有索引;每个线程都会在它自己的分区中插入记录。

最佳答案

一种常用的方法是某种形式的指数退避。而不是您的 1000*attempts+random 方法,使延迟成为尝试次数的指数函数。这确保了前一两次尝试的延迟最小,这可能只是运气不好导致您陷入僵局,但稍后会出现更大的延迟,此时很明显连接确实很拥塞。

当然,另一种方法是尝试安排您的数据库访问,以便不太可能发生死锁。但是,如果不知道您的查询是做什么的(以及它们是如何执行的以及何时执行的),就不可能说这是否可以完成

关于java - 多线程——避免和处理数据库死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1866287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com