spring 事务传播机制
spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式。 绿色的 那几个 我认为比较重要。
1 , @Transactional(propagation=Propagation.REQUIRED) 默认值 等于 @Transactional
有父方法传递过来的 事务环境,就在使用父方法的事务环境,如果父方法没有事务环境,那么就用新开启一个事物。
备注:非事务执行的意思是单条sql就提交。
例子设置: A 方法调用 B,C两个子方法。C执行后在C的方法中抛出异常
情景1 条件:A 什么都不加,B 什么都不加,C,Propagation.REQUIRED ,
结果:C 执行以后抛出异常。结果 B能写入 ,C写入的被回滚。
解析:A,B都是非事物环境,C起了一个新的事务。
情景2 条件:A 加 @Transactional ,B 什么都不加,C,Propagation.REQUIRED ,
结论:B C 的操作都回滚了
解析:B,C都是用的 A开启的事务环境,C的时候抛出异常, 全部回滚。
关键字:有就用,没有就新建一个
2 ,@Transactional( propagation=Propagation.SUPPORTS)
如果父方法没有事物换机,那么当前方法就使用非事务环境执行,如果 有,就使用父方法的事务环境。 这个和不写几乎一样 @Transactional
例子设置: A 方法调用 B,C两个子方法。C执行后在C的方法中抛出异常
情景1 条件:A 什么都不加,B 什么都不加,C,Propagation.SUPPORTS,
结果:B,C 都能写入成功
解析:ABC,都是非事务环境
情景2 条件:A @Transactional ,B 什么都不加,C,Propagation.SUPPORTS,
结果:B,C 都能写入后都回滚了,
解析:ABC,都处于A开启的事务环境。
关键字:有就用,没有就不用
3 @Transactional(propagation=Propagation.MANDATORY)
当前方法必须处于事物环境才能执行。
例子设置: A 方法调用 B,C两个子方法。
情景1 条件:A 什么都不加,B 什么都不加,C,Propagation.MANDATORY,
结果:执行C的时候抛出异常( No existing transaction found for transaction marked with propagation 'mandatory' )
解析:C 需要事物环境才能执行
情景2 条件:A @Transactional ,B 什么都不加,C,Propagation.MANDATORY,
结果: 正常执行到
解析:C 需要事物环境才能执行
关键字:必须要父类给我一个事务环境
4 @Transactional(propagation=Propagation.REQUIRES_NEW)
必定要新开启一个事务。
例子设置: A 方法调用 B,C两个子方法。C执行后在C的方法中抛出异常
情景1 条件:A 什么都不加,B 什么都不加,C,Propagation.REQUIRES_NEW,
结果:B 能写入,C 写入后被回滚了。
解析:在父类没有事务环境的情况下,C启动了一个新的事务
情景2 条件:A @Transactional ,B 什么都不加,C,Propagation.REQUIRES_NEW,
结果: B,C都没有写入数据
解析: 明显C 让父类事务一起回滚了。C如果 回滚,父类事物也会回滚。
情景3 条件:A @Transactional ,B 什么都不加,C,Propagation.REQUIRES_NEW, 去掉 C执行后在C的方法中抛出异常,在A中 执行完C后抛出异常。
结果: B的数据没写进去,C的数据写进去;额
解析: B 使用的A开启的事物 ,C 开启了一个新事物。并且C执行完成以后就提交了,A 里面的异常让B一起回滚了。
关键字:新建一个,父回滚子不回滚,子回滚,父也会滚。 并且子事物是在 子方法完成的时候提交的。
5 @Transactional(propagation=Propagation.NOT_SUPPORTED)
当前方法一定不回用在事务环境执行,如果父类有事务,那么就先把它挂起。 和 REQUIRED 是相反的。
例子设置: A 方法调用 B,C两个子方法。C执行后在C的方法中抛出异常
情景1 条件:A @Transactional,B 什么都不加,C,Propagation.NOT_SUPPORTED,
结果:B没有写入,C能写入。
解析:B 写入了,然后被 C里面的 抛出的异常 给触发回退了,C 里面是非事执行,能够正常写入。
关键字:不会在事务环境执行
6 @Transactional(propagation=Propagation.NEVER)
和 MANDATORY 相反 ,这个方法只能执行在非事务环境,如果父类有事物,就抛出异常
例子设置: A 方法调用 B,C两个子方法
情景1 条件:@Transactional ,B 什么都不加,C,Propagation.NEVER,
结果:抛出异常(Existing transaction found for transaction marked with propagation 'never')
解析:NEVER 的父方法不能有 事物环境。
关键字:父层不能有事务
7 @Transactional(propagation=Propagation.NESTED)
内嵌事物,在没有外部事务 的时候 和 REQUIRED 一样, 这个和 Propagation.REQUIRES_NEW 容易混淆 ,Propagation.REQUIRES_NEW 是挂起父事物,然后新启动一个事物,新的事务完成后先提交,新事物回滚,父事物一起回滚,
Propagation.NESTED 是在 父环境有事物的时候,会做一个保存点,然后在 如果 当前方法抛出异常,就回滚到保存点,如果 父事物 回滚,当前方法里面的写操作也回滚,而且本质上只有一个事物,所以在父方法事物提交的时候提交。
例子设置: A 方法调用 B,C两个子方法,C方法内部执行完成以后抛出异常
情景1 条件:@Transactional ,B 什么都不加,C,Propagation.NEVER,
结果: B 没有写入成功,C也没有写入成功。
解析:.这个结果和 REQUIRES_NEW 类似,不做解释,后面进一步确认。
情景2 条件:@Transactional ,B 什么都不加,C,Propagation.NEVER, ,但是抛异常的位置改成A方法内部,C方法调用以后。
结果: B 没有写入成功,C也没有写入成功。
解析:综合和上面2个例子。NESTED 内层事物回滚,外层也会滚,外层回滚内层也会回滚。并且内层事物提交的 时间节点是和外层事务 一起提交。
关键字:父子同步回滚,父子一起提交
备注:sharding JDBC 不支持 @Transactional(propagation=Propagation.NESTED)
spring 事务传播机制的更多相关文章
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- Spring事务传播机制和数据库隔离级别
Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...
- Spring事务传播机制与隔离级别(转)
Spring事务传播机制与隔离级别 博客分类: Spring 转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...
- 面试突击87:说一下 Spring 事务传播机制?
Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的. 既然是"事务传播",所以事务的数量应该在两个或两个以上,Spring 事务传播机制的 ...
- Spring事务传播机制
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...
- spring事务传播机制的测试结果
/** * @Component是个一般性的注解,使用此注解修饰的POJO类,有value属性,指定bean的id.也可不写.默认值是类名首字母小写 * @Resource是控制依赖注 ...
- 18个示例详解 Spring 事务传播机制(附测试源码)
什么是事务传播机制 事务的传播机制,顾名思义就是多个事务方法之间调用,事务如何在这些方法之间传播. 举个例子,方法 A 是一个事务的方法,方法 A 执行的时候调用了方法 B,此时方法 B 有无事务以及 ...
- Spring事务传播机制&隔离级别
一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用:PROPAGATION_ ...
- spring事务传播机制与隔离级别、通知类别
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型 说明 PROPAGATIO ...
随机推荐
- struts2之数据校验
概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过四种方式来阐述Struts ...
- Note of Jieba
Note of Jieba jieba库是python 一个重要的第三方中文分词函数库,但需要用户自行安装. 一.jieba 库简介 (1) jieba 库的分词原理是利用一个中文词库,将待分词的内容 ...
- cocos Studio使用问题
使用的时候最好是同一套资源饭在一个文件夹下,或者新建的文件和资源类,一个资源分一个产生的层文件
- python命令随记
1. pip版本需要升级命令: python -m pip install --upgrade pip 2.查找Django命令 pip show django 3.查看python安装目录 进入Py ...
- nim调用GetSystemPowerStatus判断笔记本电脑是否接通外接电源
title: nim调用GetSystemPowerStatus判断笔记本电脑是否接通外接电源 tags:nim,winapi,dll --- 转载条件:如果你需要转载本文,你需要做到完整转载本文所有 ...
- 用Webstrom搭建Vue项目
一.首先要有Node.js Webpack环境 1.Node.js:是一个能够在服务器端运行JavaScript的开放源代码,跨平台JavaScript运行环境.Node采用Google开发的V8 ...
- TCP学习总结(二)
前面一节咱们介绍完了TCP协议,这部分,将要介绍,TCP是如何实现可靠传输的. TCP的可靠传输 1.滑动窗口 上一节我们介绍TCP报文段头部的时候说得到,"窗口"这个部分,&qu ...
- C# 事件 解析
1.什么是事件,事件和委托什么关系? 事件?事件,就是,比如按一个按钮,弹出你好对话框,就是一个事件. 事件和委托? 事件就是委托的一种呀,委托可以理解为回调机制,回调函数. 2. 怎么理解C#事件, ...
- Regular Express 匹配中文,所有中文标点符号
import re import requests text=requests.get("https://movie.douban.com").text #1.匹配汉字 \u4E0 ...
- Linux文件属性描述
mtime -- modify time 修改时间 硬链接硬链接(hard link, 也称链接)就是一个文件的一个或多个文件名.再说白点,所谓链接无非是把文件名和计算机文件系统使用的节点号链接起来. ...