Spring 事务传播行为的使用
Spring 事务传播行为的使用
★关键日志
事务提交日志:
Transaction synchronization committing SqlSession
Transaction synchronization deregistering SqlSession
Transaction synchronization closing SqlSession
事务回滚日志:
Transaction synchronization resuming SqlSession
Transaction synchronization deregistering SqlSession
Transaction synchronization closing SqlSession
PROPAGATION详解
不加事务:支持当前事务,如果没有事务就以非事务方式运行。
PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS -- 支持当前事务(即能查询到update或insert,但是没有提交的东西--事务方法都是等方法执行完才提交), 如果当前没有事务,就以非事务方式执行。(在类中不加注解的情况下和不加事务是一样的,类中加了注解就可以加此注解来实现不加注解的情况)
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行,如果执行失败,内部事务(即 ServiceB#methodB) 将回滚到它执行前的 SavePoint(回滚本身)。
如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
事务及嵌套事务的理解:
1.Propagation.REQUIRED:同一个事务,一起成功或失败。注意:REQUIRED方法内的事务方法,不应该try-catch 而不抛出异常。
2.Propagation.REQUIRES_NEW:完全是新的事务,回滚或提交不受外部影响。
3.Propagation.NESTED的嵌套事务理解 :
(1)回滚只是回滚内部方法本身,外部事务可以选择回滚/提交(try-catch方式处理的不同处理)
PS:这点Propagation.REQUIRES_NEW也能做到。
(2)外部事务提交回滚/提交,它也进行回滚/提交(它成功时的提交是在外部事务提交时)。
PS:这点Propagation.REQUIRES_NEW做不到。
异常:Transaction rolled back because it has been marked as rollback-only原因
1.捕获后又抛出了不回滚的异常(默认RuntimeException才回滚,而Exception不回滚)。
2.Propagation.REQUIRED A方法调用 Propagation.REQUIRED B方法,如果捕获了B方法中的异常没有抛出 或 捕获后又抛出了不回滚的异常(默认Exception不回滚)。
Transactional的不回滚问题
1、检查你方法是不是public的,public方法的Transactional注解才是有效的,才能控制事务。
2、Spring默认只对UnChecked异常(RuntimeException)回滚,对于Checked(Exception)异常不回滚。
你的异常类型是Checked异常。如果想check异常也想回滚怎么办?
(1)注解上加rollbackFor=Exception.class
(2)对异常进行转换,转换成RuntimeException或自定义继承RuntimeException的异常(如承保2.0的BusinessException)
3. 同一个类中的方法调用,内部方法的事务是没有效果的。
如方法A没加事务,方法B中加了事务(不管加的是什么类型的事务)。方法A调用方法B,这样方法B中的事务是无效的。因为AOP只对A方法进行处理了,而不会对内部的B方法进行处理。
父类中加了Transactional注解,子类中会继承。
现象:service层继承了CommonSercice的方法默认。CommonSercice加了transaction注解,结果service层的每个方法都默认有了transaction注解(required)。
项目实践(不一定遵守,怎么方便怎么用)
1.不在类中加@Transactional,只在用到的方法中加。
2.不用PROPAGATION_SUPPORTS,因为效果和不加是一样的。
3.大多数事务:PROPAGATION_REQUIRED即可满足要求,要有rollbackFor=Exception.class,格式统一如下:
@Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class)
Spring 事务传播行为的使用的更多相关文章
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- Spring事务传播机制
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...
- Spring事务传播特性的浅析——事务方法嵌套调用的迷茫
Spring事务传播机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷. 其实这 ...
- Spring事务传播机制和数据库隔离级别
Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...
- spring 事务传播机制
spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式. 绿色的 那几个 我认为比较重要. 1 , @Transactional(propagation=P ...
- 事务、事务特性、事务隔离级别、spring事务传播特性
事务.事务特性.事务隔离级别.spring事务传播特性 1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功, ...
- 什么是事务、事务特性、事务隔离级别、spring事务传播特性
1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...
- spring事务传播实现源码分析
转载. https://blog.csdn.net/qpfjalzm123/article/details/83717367 本文只是对spring事务传播实现的流程进行简单的分析,如有不对之处请指出 ...
- Spring事务传播属性介绍(二).mandatory、not_supported、never、supports
Required.Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Nested传播属性分析传送 ...
- Spring事务传播属性介绍(三).Nested
Required.Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Mandatory.Neve ...
随机推荐
- arguments 参数
下面要写的是知识梳理的一个案例: 写一个求和的方法sumFn,不管传递的参数有什么,都能将最终的和算出来,并且返回给函数外部使用.(要求:一个参数都不传默认结果为0,对于传递的非正常数字的参数不与累加 ...
- BZOJ4516: [Sdoi2016]生成魔咒(后缀数组 set RMQ)
题意 题目链接 Sol 毒瘤SDOI 终于有一道我会做的题啦qwq 首先,本质不同的子串的个数 $ = \frac{n(n + 1)}{2} - \sum height[i]$ 把原串翻转过来,每次就 ...
- JavaScript的进阶之路(七)客户端JavaScript知识点总结
一.客户端JavaScript主要是BOM DOM的操作和js脚本的兼容性.互用性.可访问性.安全性的应用.以及一些框架的引用. 二.BOM:浏览器对象模型 主要介绍window对象 1.定时器:se ...
- Jquery插件 “IT小鲜肉 Tree”,猛烈完善中
今天又给Jquery插件“IT小鲜肉 Tree”添加了自定义图标.自定义标签显示功能:目前“IT小鲜肉 Tree”已经具备有checkbox.drag and drop 等基本功能. 废话不说,直接上 ...
- CSS中的onmouseover和hover有什么区别
它们一样是因为:都是鼠标落上去的时候触发的.它们不一样是因为:onmousemove是javascript里面的,他可以触发js命令,但是hover做不到,hover只是css样式的类,只能定义样式. ...
- HBase性能优化方法总结
1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数 ...
- Azure Linux 虚拟机常见导致无法远程的操作
对Azure虚拟机的一些操作可能会导致无法远程连接,本文罗列了以下导致不能远程连接的场景: 场景1 - 在虚拟机配置IP地址或MAC地址 场景2 - 错误地修改服务的配置文件 场景3 - 误设置防火墙 ...
- python 装饰器的详细理解【多次实验】
demo: # 装饰器其实就是对闭包的使用 print('haha嘻嘻') def hot(): print('知道') def dec(fun): print("call dec" ...
- FTP自动上传
注:该脚本上传的压缩文件,通过文件资源管理器拿下来后会提示压缩文件损坏.使用 ftp -s:d:\audit_log\ftp_upload.txt 方法可行(http://www.cnblogs.co ...
- 准备你的 In-app Billing 程序
准备好你的内购应用 在开始使用 In-app Billing 服务之前,你需要先把包含 In-app Billing Version 3 API 的库添加到你的Android工程中.你还需要设置你的应 ...