【发布时间】:2016-10-26 19:08:56
【问题描述】:
我有这样的代码
@Transactional(propagation = Propagation.NESTED)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class C1 {
...
public void xxx() {
try {
obj.someMethod();
} catch (Exception e) {
C2.yyy();
}
}
}
public class C2 {
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false)
public void yyy() {
...
}
}
我的假设是当obj.someMethod(); 抛出一个违反约束的异常时C2.yyy() 应该仍然能够将内容保存到数据库中。
但是我看到的是,当 C2.yyy() 被称为 Postgres 报告时
错误:当前事务被中止,命令被忽略,直到事务块结束
为什么要这样做?毕竟C2.yyy() 应该在不同的事务中运行,该事务应该不受调用代码中发生的状态的影响。不?
更新
在进一步调试时,我发现 - 让我们说调用堆栈是这样的
@Transactional(readOnly = false, propagation = Propagation.NESTED)
b1.m1()
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
b2.m2()
b3.m3()
b4.m4()
我的假设是由于 b2.m2() 上的注释,m4() 中的数据库代码将在新事务中执行。但似乎TransactionAspectSupport.java 中的代码仅在当前方法上查看事务注释,而不在堆栈上查看。当它在 m4() 上没有找到任何 @transactional 时,它假定 REQUIRES。这不正确吗?
【问题讨论】:
标签: database spring postgresql spring-transactions