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,使延迟成为尝试次数的指数函数.这可以确保在前一次或两次尝试中的最小延迟,在这种情况下,您可能只是运气不好而导致死锁,但在以后很明显连接确实很拥挤时会给您带来更大的延迟.
当然,另一种方法是尝试安排数据库访问,以便不太可能发生死锁.但是,如果不知道你的查询是什么(以及如何以及何时执行),就不可能说这是否可以完成 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |