Spring事务的传播行为
事务传播
事务传播的几种情况
序号 | 事务的传播机制 | 说明 | 备注 |
---|---|---|---|
1 | required | 如果当前存在事务,就加入该事务。 如果当前没有事务,就创建一个新事务。 这是最常用的设置。 | 只创建一个事务。 |
2 | requires_new | 不管是否存在事务,都创建一个新的、自己的事务。老事务先挂起,再创建新事务,新事务 执行完并提交,接着,继续执行 老事务最后提交。 | 1、每次都创建一个新的事务。 2、创建 新事务 前,老事务 先挂起。 3、先执行的方法后提交事务,后执行的方法先提交事务。 4、老事务 的回滚,不会影响 新事务 的提交。 |
3 | nested | 如果当前存在事务,则 嵌套事务与外面事务使用同一事务,不同的是 嵌套内部开启一个新的保存点( savepoint ),执行有两种情况: (1)当嵌套内部 发生回滚,不影响外面事务的正常提交。 (2)当外面事务 发生回滚,则嵌套内的事务要回滚。 (3)未发生异常时,则嵌套内的事务和外部事务一起,一个整体提交。如果当前没有事务,则执行与 required 类似的操作。 | 皮尚在,毛被烧掉。 皮之不存,毛将焉附。 |
4 | supports | 支持当前事务。 如果当前存在事务,就加入该事务, 如果当前不存在事务,就以非事务执行。 | supports 不会创建事务。 |
5 | not_supported | 不支持事务。 如果当前存在事务,就把当前事务 挂起。 如果当前没有事务,就以非事务执行。 | |
6 | mandatory | 强制、必须使用事务。 如果当前 已经存在事务,就加入该事务, 如果当前不存在事务,就 抛出异常。 | 1、mandatory 不会创建事务。 2、mandatory 执行的前提是已经存在事务。 |
7 | never | 禁止事务 。 如果当前存在事务,则 抛出异常, 如果当前没有事务,以非事务方式执行, | 必须在一个没有事务中执行,否则报错。 |
事务传播的几种情况理解
行为 | 类型 |
---|---|
有就加入,没有就算了 | supports |
外面有没有都要是新事务 | requires_new |
外面有就加入,没有就新事务 | required |
外面有就加入,保存点加入,没有就新事物 | nested |
不要事务,外面有先挂起 | not_supported |
要求外面有事务(不满足异常) | mandatory |
要求外面没有事务(不满足异常) | mandatory |