Spring本地事务总结

53 阅读2分钟

参考:

1. www.jianshu.com/p/710b4f93e…

2. blog.csdn.net/yanyan19880…

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 (非事务运行)*

说明: 当前方法不应该有事务。  

  • 如果父方法有事务,子方法将父方法事务挂起,以非事务状态运行。
  • 如果父方法没有事务,子方法以非事务方式进行。