加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 19:34:38 所属栏目:Java 来源:网络整理
导读:我正在寻找一个从 Java 6应用程序中处理数据库死锁的好策略;可能会有几个并行线程同时写入同一个表.如果数据库(Ingres RDMBS)检测到死锁,它将随机杀死其中一个会话. 考虑到以下要求,处理死锁情况的可接受技术是什么? 应保留总耗用时间 尽可能小的 杀一个会
我正在寻找一个从 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);

它可以以任何方式改进吗?例如等待固定数量(幻数)秒.
是否有不同的策略可以产生更好的结果?

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

注意:插入记录的表被组织为堆分区表并且没有索引;每个线程都会在其自己的分区中插入记录.

解决方法

常用的方法是某种形式的指数退避.而不是你的1000 *尝试随机aproach,使延迟成为尝试次数的指数函数.这可以确保在前一次或两次尝试中的最小延迟,在这种情况下,您可能只是运气不好而导致死锁,但在以后很明显连接确实很拥挤时会给您带来更大的延迟.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读