我需要对使用Java持久性时重试“可重试”异常(例如类似锁等待超时之类)的正确方法进行一些说明。例如,使用伪代码,例如:
EntityTransaction tx = em.getTransaction();
tx.begin();
for (a bunch of objects) {
em.persist(object);
}
tx.commit();
如果数据库中有锁,有时会在em.persist调用中引发异常。我可以将它包装在try / catch中然后重试吗(很明显,有一些计数)?还是我必须包装整个tx.begin / commit并重做?
谢谢
最佳答案
假设没有锁定超时作为解决数据库死锁的方法,那么一个更简单的解决方案是对请求使用更长的超时。可以将超时设置为N
秒,而不是使用C
秒超时并重试最多N * (C + 1)
次。
(如果您将锁定超时用作死锁的一种解决方法,那么您会遇到更大的问题。您最好尝试解决死锁的根本原因,因为即使使用C
重试,您也有可能交易将无法进行。)