我有一个Spring和hibernate应用程序(两个最新版本),我有两个bean,如下所述
@Component
public class Bean1{
@Autowired
Bean2 bean2;
@Transactional(propagation = Propagation.REQUIRED)
public void foo()
{
bean2.bar();
}
@Component
public class Bean2{
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void bar()
{
try{
// Do something which throws exception
}
catch (Exception e) {
log & eat the exception here only.
But inspite of this the outer transaciton gets rolled back
}
}
问题是当bean2.bar
导致任何异常(例如外来Key ConstraintViolationException
)时,它会回滚外部事务并说“事务已回滚,因为它已被标记为仅回滚”, “moreInfo”: “”}“
在看到hibernate日志时,我发现“新事务”只有一行
D| o.s.o.h.HibernateTransactionManager- Creating new transaction with name ... PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
这意味着没有为内部bean2.bar();
我无法弄清楚这里有什么问题?任何帮助是极大的赞赏。
答案 0 :(得分:1)
REQUIRES_NEW仅适用于JTA交易经理。 请参阅Spring Doc here
<强> REQUIRES_NEW 强>
public static final Propagation REQUIRES_NEW
非事务性执行,暂停当前事务(如果有) 存在。类似于同名的EJB事务属性。
注意: 实际的交易暂停不适用于所有的开箱即用 交易经理。这尤其适用于 JtaTransactionManager,需要 javax.transaction.TransactionManager将其提供给它 (在标准J2EE中是特定于服务器的)。