spring事务的传播机制
1、spring事务
指封装在数据库事务之上的一种事务处理机制。其管理方法有两种,分别是编程式事务以及声明式事务。
一般我们使用@transactional进行声明式事务。
2、spring事务的传播机制
事务的传播,是指一个方法调用另一个方法并将事务传递给它。
事务的转播机制主要针对被调用者而言,控制它是否被传播或者被怎样传播。
spring事务的传播机制有七种
| 传播行为 | 描述 |
| propagation_required | 默认的spring事物传播级别,若当前存在事务,则加入该事务,若不存在事务,则新建一个事务 |
| propagation_require_new | 若当前没有事务,则新建一个事务。若当前存在事务,则新建 一个事务,新老事务相互独立。外部事务抛出异常回滚不会影响内部事务的正常提交 |
| propagation_nested | 如果当前存在事务,则嵌套在当前事务中执行。如果当前没有事务, 则新建一个事务,类似于require_new |
| propagation_supports | 支持当前事务,若当前不存在事务,以非事务的方式执行 |
| propagation_not_supported | 以非事务的方式执行,若当前存在事务,则把当前事务挂起 |
| propagation_mandatory | 强制事务执行,若当前不存在事务,则抛出异常 |
| propagation_never | 以非事务的方式执行,如果当前存在事务,则抛出异常 |
传播级别一般不需要定义,默认就是propagation_required,除非在嵌套事务的情况。
上述描述表格的描述还是比较抽象,下面我们使用一个例子来说明这个传播机制。
假定方法a调用方法b
| 方法b定义的事务类型 | a方法有事务时 | a方法无事务 |
| @transactional(propagation = propagation.required) | b和a事务合并成一个事务 | b新建一个事务 |
| @transactional(propagation = propagation.requires_new) | b新建一个事务,和a事务无关,互不影响 | b新建一个事务 |
| @transactional(propagation = propagation.nested) | b新建一个a的子事务,a异常影响b,b异常不影响a | b新建一个事务 |
| @transactional(propagation = propagation.supports) | b加入到a事务中 | b无事务 |
| @transactional(propagation = propagation.not_supported) | 挂起a事务,b以无事务方式执行 | b无事务 |
| @transactional(propagation = propagation.mandatory) | b加入到a事务中 | b抛异常 |
| @transactional(propagation = propagation.never) | b抛异常 | b无事务 |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论