参考:
1. www.jianshu.com/p/710b4f93e…
3. blog.51cto.com/u_15246373/…
事务挂起的举例:(某事务挂起之后,任何操作都不在该事务的控制之下)
例如: 方法A支持事务,方法B不支持事务。 即PROPAGATION_NOT_SUPPORTED
方法A调用方法B。
在方法A开始运行时,系统为它建立Transaction,方法A中对于数据库的处理操作,会在该Transaction的控制之下。
这时,方法A调用方法B,方法A打开的 Transaction将挂起,方法B中任何数据库操作,都不在该Transaction的管理之下。
当方法B返回,方法A继续运行,之前的Transaction回复,后面的数据库操作继续在该Transaction的控制之下 提交或回滚。
ROPAGATION_REQUIRED ( 一荣俱荣,一损俱损 )*
说明: 默认的事务级别, 需要事务。
- 如果父方法有事务,子方法就加入当前的事务。
- 如果父方法没有事务,子方法则创建新的事务。
如果所有的Transactional标签都是默认的,REQUIRED时,方法里的提交、回滚都是一起的,要么所有都提交,要么所有都回滚。
PROPAGATION_REQUIRES_NEW ( 互相独立 )*
说明: 创建新的事务并执行。
- 如果父方法有事务,子方法将当前事务挂起,新建一个事务。
- 如果父方法没有事务,子方法则创建新的事务。
PROPAGATION_NESTED( 嵌套,外层影响内层,内层不影响外层 )*
说明: 嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。
- 如果父方法有事务,子方法则事务嵌套执行。
- 如果父方法没有事务,子方法则创建新的事务。
PROPAGATION_MANDATORY ( 必须有事务,强人所难 )*
说明: 当前方法必须要在有事务方法中运行,不然就抛出异常。
- 如果父方法有事务,子方法融入这个事务。
- 如果父方法没有事务,调用子方法抛出异常。
PROPAGATION_NEVER ( 必须没有事务,强人所难 )* 说明: 当前方法不应该运行在事务中。
- 如果父方法有事务,调用子方法抛出异常。
- 如果父方法没有事务,子方法以非事务方式进行。
PROPAGATION_SUPPORTS (顺其自然)*
说明: 当前方法支持调用方法设置。
- 如果父方法有事务,子方法融入这个事务。
- 如果父方法没有事务,子方法以非事务方式进行。
PROPAGATION_NOT_SUPPORTED (非事务运行)*
说明: 当前方法不应该有事务。
- 如果父方法有事务,子方法将父方法事务挂起,以非事务状态运行。
- 如果父方法没有事务,子方法以非事务方式进行。