Spring事务的传播行为
Spring事务的传播行为
Spring事务的传播行为有七种,对应着事务定义接口
TransactionDefinition
中的七种状态。PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED
。
- PROPAGATION_REQUIRED
如果当前上下文中没有事务,就创建一个事务;如果当前存在事务,就加入该事务,这是最常用的默认设置。单独调用methodB时,因为上下文中没有事务,会开启一个新的事务,异常时会回滚;调用methodA时,因为上下文不存在事务,会开启一个新的事务,当执行到methodB时,methodB发现上下文有事务,就加入到当前事务中,如果methodB发生异常,触发事务回滚,methodA中的事务也会回滚。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {methodB();//do something
}@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {//do something
}
- PROPAGATION_SUPPORTS
支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务的方式执行。如果调用methodA,执行到methodB时,methodB会加入到methodA开启的事务中。如果直接调用methodB,当前没有事务,就以非事务的方式执行,methodB发生异常也不会回滚。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {methodB();//do something
}@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {//do something
}
- PROPAGATION_MANDATORY
支持当前事务,如果当前存在事务,就加入到该事务;如果当前不存在事务,就抛出异常。单独调用methodB,由于当前没有事务,就会跑出非法事务状态异常;如果调用methodA,执行到methodB时,就会添加到methodA开启的事务当中。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {methodB();//do something
}@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {//do something
}
- PROPAGATION_REQUIRES_NEW
如果当前已有事务,会先挂起,然后开启一个新的事务。事务管理器需要使用
JtaTransactionManager
。当调用methodA,会先开启事务,执行A的pre部分的代码,然后调用methodB,methodB会开启一个新的事务后执行自身的代码,最后再执行methodA的post部分的代码。如果methodB发生异常回滚,只是methodB中的代码回滚,不影响methodA中的代码。如果methodA发生异常回滚,只会滚methodA中的代码,不影响methodB中的代码。外层事务和内层事务互不影响。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {//do something premethodB();//do something post
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {//do something
}
- PROPAGATION_NOT_SUPPORTED
不支持事务,如果当前存在事务,就把事务挂起来。调用methodA,再调用methodB,methodA开启的事务会被挂起,methodB内部抛出异常不会回滚。methodA发生异常会回滚。直接调用methodB,不会开启事务。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {methodB();//do something
}@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {//do something
}
- PROPAGATION_NEVER
以非事务的方式执行,存在事务就抛出异常。先调用methodA,再调用methodB会报错。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {methodB();//do something
}@Transactional(propagation = Propagation.NEVER)
public void methodB() {//do something
}
- PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就按照
PROPAGATION_REQUIRED
属性执行。单独调用methodB,就按照PROPAGATION_REQUIRED
执行。如果调用methodA,开启一个事务,执行pre部分的代码,设置回滚点,再调用methodB,如果methodB发生错误,此时会回滚到之前的回滚点,此时的事务并没有提交,如果后续的post部分调用失败,则回滚包括methodB的所有操作。内层事务依赖于外层事务,外层事务失败会回滚内层事务所做的动作,而内层事务操作失败并不会引起外层事务的回滚。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {//do something premethodB();//do something post
}@Transactional(propagation = Propagation.NESTED)
public void methodB() {//do something
}
Spring事务的传播行为相关推荐
- 面试官:Spring事务的传播行为有几种?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:程序员入职国企,1周上班5小时,晒出薪资感叹:腾讯当CEO也不去个人原创+1博客:点击前往,查看更多 在Spri ...
- spring手动控制事务开启_“上帝视角”图解Spring事务的传播机制原理
转载:https://mp.weixin.qq.com/s/odP1DKgRtXsCcAKxwGahug 数据库事务的"抓手" 数据库的事务功能已经由数据库自身实现,它留给用户的就 ...
- 数据库事务原理详解-Spring 事务的传播属性
所谓spring 事务的传播属性,就是定义在存在多个事务同时存在的时候,spring 应该如何处理这些事务的行为.这些属性在TransactionDefinition 中定义,具体常量的解释见下表: ...
- Spring事务的传播机制
spring事务的传播机制 1.spring事务 指封装在数据库事务之上的一种事务处理机制.其管理方法有两种,分别是编程式事务以及声明式事务.一般我们使用@Transactional进行声明式事务. ...
- Spring 事务的传播属性
Spring 事务的传播属性 事务的传播属性: 1.PROPAGATION_REQUIRED * :如果不存在事务则新建事务,若存在事务则加入事务,默认是这个 2.PROPAGATION_SUPPOR ...
- spring事务的传播
1.spring事务的传播 为什么会有传播机制 spring对事务的控制,是使用aop切面实现的 场景一:A调用B,都有事务,B异常,让B提交还是两个一起回滚 场景二:A调用B,A有事务,是够让B加入 ...
- Spring事务管理-传播行为-隔离级别
事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败. 事务的特性:ACID 原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 一致性:事务前后数据的完整性约束保持一致 ...
- Spring事务的传播行为案例分析
简介:网上关于Spring事务传播性以及隔离型的文章漫天盖地,还有不负责任的直接复制名词意思,文章虽然很多却是看的云里雾里,我们今天将给出案例分别和大家一起学习. 网上关于Spring事务传播性以及隔 ...
- Spring事务处理,以及Spring事务的传播属性和隔离级别
本文转自:http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html 事务的隔离级别:事务隔离级别用于处理多事务并发的情况,通常使用 ...
最新文章
- linux 消息对lie_Linux进程间通信之消息队列总结
- 数据结构-----AVL树的旋转操作
- SAP Analytics Cloud里的Planning model
- PS提示错误1解决办法
- 前端学习(684):循环导读
- 【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
- css3实现的精美菜单
- win和mac系统Sublime Text 3配置编译c和c++
- 使用Xunit来进行单元测试
- [转]最长回文字符串
- 理解position与anchorPoint[转]
- 【Webcam设计】客户机与程序之间的通信cv::imencode/imdecode与 std::ifstream file与imread/imwrite方式
- 在某龙芯平台上编译FFMPEG报错:ERROR: xxx not found using pkg-config
- cvpr2019论文汇总(论文/代码/项目/论文阅读)
- 12864c语言程序,LCM12864 C语言驱动程序
- MAC地址厂商信息查询
- matlab振荡环节相频特性,自动控制原理第五章频率特性)汇总.ppt
- Chrome浏览器查看Axure原型图文件,提示Axure RP Extension for Chrome
- 用计算机开方左右键,科学计算器开方怎么用(科学计算器开根号)
- 对接支付宝App支付接口详解