必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。
PROPAGATION_REQUIRES_NEW
比
如
我
们
设
计
ServiceA.methodA
的
事
务
级
别
为
PROPAGATION_REQUIRED
,
ServiceB.methodB
的
事
务
级
别
为
PROPAGATION_REQUIRES_NEW
, 那 么 当 执 行 到 ServiceB.methodB 的 时 候 ,
ServiceA.methodA 所在的事务就会挂起,ServiceB.methodB 会起一个新的事务,等
待 ServiceB.methodB
的 事 务 完 成 以 后 ,
他 才 继 续 执 行 。 他 与
PROPAGATION_REQUIRED 的 事 务 区 别 在 于 事 务 的 回 滚 程 度 了 。 因 为
ServiceB.methodB
是 新 起 一 个 事 务 , 那 么 就 是 存 在 两 个 不 同 的 事 务 。 如 果
ServiceB.methodB 已 经 提 交 , 那 么 ServiceA.methodA 失 败 回 滚 ,
ServiceB.methodB 是不会回滚的。如果 ServiceB.methodB
失败回滚, 如果他抛出的
异常被 ServiceA.methodA 捕获,ServiceA.methodA
事务仍然可能提交。
PROPAGATION_NOT_SUPPORTED
当前不支持事务。比如 ServiceA.methodA 的事务级别是 PROPAGATION_REQUIRED
,而 ServiceB.methodB 的事务级别是 PROPAGATION_NOT_SUPPORTED
, 那么当
执行到 ServiceB.methodB 时,ServiceA.methodA 的事务挂起,而他以非事务的状
态运行完,再继续 ServiceA.methodA
的事务。 网管联盟 bitsCN_com
PROPAGATION_NEVER
不 能 在 事 务 中 运 行 。 假 设 ServiceA.methodA 的 事 务 级 别 是
PROPAGATION_REQUIRED
,
而 ServiceB.methodB 的 事 务 级 别 是
PROPAGATION_NEVER
, 那么 ServiceB.methodB
就要抛出异常了。
PROPAGATION_NESTED
理解 Nested 的关键是 savepoint。他与 PROPAGATION_REQUIRES_NEW 的区别是,
PROPAGATION_REQUIRES_NEW
另起一个事务,将会与他的父事务相互独立, 而
Nested 的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就
是说,如果父事务最后回滚,他也要回滚的。 而 Nested 事务的好处也是他有一个
savepoint
:
ServiceA {
void methodA() {
try {
ServiceB.methodB();
} catch (Exception e) {
ServiceC.methodC();
}
}
}
也 就 是 说 ServiceB.methodB 失 败 回 滚 , 那 么 ServiceA.methodA 会 回 滚 到
savepoint 点 上 , ServiceA.methodA 可 以 选 择 另 外 一 个 分 支 , 比 如
ServiceC.methodC,继续执行,来尝试完成自己的事务;但是这个事务并没有在 EJB
标准中定义。