我正在寻找一个从
Java 6应用程序中处理数据库死锁的好策略;可能会有几个并行线程同时写入同一个表.如果数据库(Ingres RDMBS)检测到死锁,它将随机杀死其中一个会话.
考虑到以下要求,处理死锁情况的可接受技术是什么?
>应保留总耗用时间
尽可能小的
>杀一个会议将招致一个
重大(可衡量的)回滚
>时间线程没有办法
彼此沟通,即
战略应该是自主的
到目前为止,我提出的策略是这样的:
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);
它可以以任何方式改进吗?例如等待固定数量(幻数)秒.
是否有不同的策略可以产生更好的结果?
注意:将使用几种数据库级技术来确保死锁在实践中非常罕见.此外,应用程序将尝试避免调度同时写入同一个表的线程.上述情况只是“最糟糕的情况”.
注意:插入记录的表被组织为堆分区表并且没有索引;每个线程都会在其自己的分区中插入记录.
版权声明:本文为weixin_26717681原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。