background image

 

必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。
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

 

标准中定义。