我终于明白了这个问题:
methodA() {
methodB()
}
@Transactional(noRollbackFor = Exception.class)
methodB() {
...
try {
methodC()
} catch (...) {...}
log("OK");
}
@Transactional
methodC() {
throw new ...();
}
发生的事情是,即使methodB
具有正确的注释,methodC
也没有。抛出异常后,第二个异常@Transactional
将第一个事务标记为仅回滚。