【发布时间】:2016-01-21 12:39:39
【问题描述】:
在REQUIRED 传播的情况下,调用者方法本身是事务性的,如果它们不同,当前方法是否会覆盖封闭的事务属性(例如rollbackFor)?
插图:
Class A {
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = { SomeException.class})
void foo() {
try {
b.bar();
} catch (OtherException e) {
// is the transaction marked as rollback-only at this point ?
}
}
}
Class B {
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = { OtherException.class})
void bar() {
[...]
}
}
编辑:
好吧,我想避免琐碎的超出范围的答案,所以让我们明确一点,我知道弹簧传播处理。
如果你不是,下面是文档的相关部分,我只想澄清关于我上面示例的第一部分:
PROPAGATION_REQUIRED
当传播设置为 PROPAGATION_REQUIRED 时,逻辑 为设置所在的每个方法创建事务范围 应用。每个这样的逻辑事务范围都可以确定 单独回滚状态,具有外部事务范围 在逻辑上独立于内部事务范围。的 当然,在标准 PROPAGATION_REQUIRED 行为的情况下,所有这些 范围将映射到相同的物理事务。所以一个 在内部事务范围内设置的仅回滚标记确实会影响 外部事务实际提交的机会(如您所料 它到)。
但是,在内部事务范围设置 rollback-only 标记,外部事务尚未决定 回滚本身,因此回滚(由内部无声触发 事务范围)是意外的。对应的 此时会引发 UnexpectedRollbackException。这是预期的 行为使交易的调用者永远不会被误导 假设实际上没有执行提交。所以如果一个 内部事务(外部调用者不知道)静默 将事务标记为仅回滚,外部调用者仍然调用 犯罪。外部调用者需要收到一个 UnexpectedRollbackException 清楚地表明回滚是 而是执行。
我的问题可以改写成这样:
逻辑事务范围是否包含事务属性?
【问题讨论】:
-
您可以参考stackoverflow.com/questions/8490852/…了解多种场景的不同传播
标签: java spring transactions spring-transactions