一、什么是事务的传播特性?
事务属性的种类:传播行为、隔离级别、只读和事务超时。
事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
例如:
A,B两个方法都有事务,在A方法中去调用B方法,此时事务方法应该如何进行处理。
比如 A方法里面调用B方法。
情况一:A方法出现异常,A方法需要回滚,那么B方法需不需要回滚呢?
情况二:B方法出现异常,B方法需要回滚,那么A方法需不需要回滚呢?
二、事务的七大传播特性
propagation_XXX | 我的理解 | 官方 |
---|---|---|
propagation_requierd | 子事务共用父事务,谁有异常都回滚(同甘共苦) | 支持一个当前事务;如果不存在,创建一个新的。 |
propagation_required_new | 子事务单干,父、子事务互不影响(前提:父事务做了子事务的异常捕获,否则子事务可影响父事务)(子成年自立) | 创建一个新的事务,如果存在当前事务的话暂停(挂起)当前事务 。 |
propagation_nested | 子事务受父事务影响,父事务不受子事务影响(前提:父事务做了子事务的异常捕获,否则子事务可影响父事务)(子幼儿时期) | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与propagation_requierd类似的操作 |
propagation_supports | 支持事务:如果有父事务,就共用父事务;否则子事务也不存在 (必须存在父亲,否则儿子也不存在) | 支持当前事务;如果不存在当前事务则执行非事务。 |
propagation_not_supported | 该方法非事务地执行,不参与事务(不认父亲) | 不执行当前事务;而是总是执行非事务 |
propagation_mandatory | 强制使用当前事务,不存在父事务,抛异常 | 支持当前事务;如果不存在当前事务则抛出一个异常 |
propagation_never | 强制非事务方式执行,存在父事务,抛异常 | 不支持当前事务;如果存在当前事务则抛出一个异常 |
三、默认传播行为
Spring 默认的事务传播行为是 propagation_requierd ,它适合于绝大多数的情况。假设 ServiveY#methodY() 都工作在事务环境下(即都被 Spring 事务增强了),假设程序中存在如下的调用链:Service1#method1() -> Service2#method2() -> Service3#method3(),那么这3个服务类的3个方法 通过 Spring 的事务传播机制都工作在同一个事务中。