加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
比如说, ServiceB.methodB 的事务级别定义为 PROPAGATION_REQUIRED, 那么由于执行 ServiceA.methodA 的时候,
ServiceA.methodA 已经起了事务,这时调用 ServiceB.methodB , ServiceB.methodB 看到自己已经运行在 ServiceA.methodA
的事务内部,就不再起新的事务。而假如 ServiceA.methodA 运行的时候发现自己没有在事务中,他就会为自己分配一个事务。
这样,在 ServiceA.methodA 或者在 ServiceB.methodB 内的任何地方出现异常,事务都会被回滚。即使 ServiceB.methodB 的事务已经被
提交,但是 ServiceA.methodA 在接下来 fail 要回滚, ServiceB.methodB 也要回滚
2 : PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行
3 : PROPAGATION_MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常
4 : 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 事务仍然可能提交。
5 : PROPAGATION_NOT_SUPPORTED
当前不支持事务。比如 ServiceA.methodA 的事务级别是 PROPAGATION_REQUIRED ,而 ServiceB.methodB 的事务级别是 PROPAGATION_NOT_SUPPORTED ,
那么当执行到 ServiceB.methodB 时, ServiceA.methodA 的事务挂起,而他以非事务的状态运行完,再继续 ServiceA.methodA 的事务。
6 : PROPAGATION_NEVER
不能在事务中运行。假设 ServiceA.methodA 的事务级别是 PROPAGATION_REQUIRED , 而 ServiceB.methodB 的事务级别是 PROPAGATION_NEVER ,
那么 ServiceB.methodB 就要抛出异常了。
7 : PROPAGATION_NESTED
理解 Nested 的关键是 savepoint 。他与 PROPAGATION_REQUIRES_NEW 的区别是, PROPAGATION_REQUIRES_NEW 另起一个事务,将会与他的父事务相互独立,
而 Nested 的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
而 Nested 事务的好处是他有一个 savepoint 。
更多相关Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。