[英]Rerunning failed Container-Managed transactions in Java EE
我在使用Java EE Bean托管事务的旧系统中遇到了问题。 尝试检索刚刚创建的内容时,将引发LockAcquisitionException
。
我最初的想法是:
@TransactionAttribute(SUPPORTS)
public Item retrieveItem(int id) {
Item i;
try {
i = em.find(Item.class, id);
} catch (PersistenceException e) {
if (e.getCause() instanceof LockAcquisitionException) {
i = retrieveItem(id);
}
}
return i;
}
但是-进行递归调用时,事务已经终止-并且似乎没有创建新事务。 我尝试了不同的TransactionAttributes
,但似乎没有什么不同。 还尝试自己管理事务( em.getTransaction()
),但这在CMT中是非法的。
我并不是要寻找一个优雅的解决方案-正如我所说的,这是旧的,我只需要将其分类的东西,直到几个月后整个东西都被替换!
干杯。
尝试注释retrieveItem
与@TransactionAttribute(REQUIRES_NEW)
它会接着在一个新的事务执行。
注意:
所以我不知道它是否适合您的情况。 但这是我知道的唯一操作,如果原始事务已失效,则成功进行操作。
不幸的是,我能找到的唯一方法是解决事务的原因-所以现在我在retrieveItem()
的开始处执行em.flush()
retrieveItem()
。 等不及要替换此应用了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.