事务457——事务的七个传播行为
继上一篇文章,我们讲到了事务的传播行为,具体是那七个。我们在罗列一遍:
PROPAGATION_REQUIRED
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
PROPAGATION_SUPPORTS
如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
PROPAGATION_MANDATORY
如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
PROPAGATION_REQUIRES_NEW
总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED
总是非事务地执行,并挂起任何存在的事务
PROPAGATION_NEVER
总是非事务地执行,如果存在一个活动事务,则抛出异常
PROPAGATION_NESTED
如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
我们就转账例子说一下。 比如,在转账的services中有个两个方法,方法A和方法B。
方法A
ServiceA {
read A =100 ;
If(doSome()){
A = A + 1;
}else{
A = A - 1;
}
Update A;
Commit;
}
1
2
3
4
5
6
7
8
9
10
方法B
ServiceB {
void doOther() {
read B ;
B = B – 1;
Update B;
If(B>0){
Commit;
Return ture;
}else{
Rollback;
Return false;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
(1)REQUIRED——必须有事务
指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;若当前没有事务,则创建一个新事务。这种传播行为是最常见的选择,也是Spring默认的事务传播行为。
比如说,Servicedo的doOther()方法上加上了传播行为PROPAGATION_REQUIRED。若doSome()方法在调用doOther()方法时就是在事务内运行的,则doOther()方法的执行也加入到该事务内执行。若doSome()方法在调用doOther()方法时没有在事务内执行,则doOther()方法会促使doSome()创建一个事务,并在加入其中执行。在doSome()或者在doOther()内的任何地方出现异常,事务都会被回滚。即使doOther()的事务已经被提交,doSome()在接下来fail要回滚,doOther()也要回滚。
简单来说,谁调加了REQUIRED的方法,谁就要具有一个事务,被调用的方法可有可无事务,但是调他的必须有事务
(2)SUPPORTS ——支持事务
指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。 定义在再方法doOther()上,定义在doSome()上。
(3)MANDATORY ——托管事务
指定的方法必须在当前事务内执行。就是说,他只能被一个父事务调用。若当前没有事务,则直接抛出异常。 定义在再方法doOther()上,定义在doSome()上。doSome()是father。
(4)REQUIRES_NEW ——需要新事务
总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。
比如,我们设计ServiceA.doSome()的事务级别为PROPAGATION_REQUIRED,ServiceB.doOther()的事务级别为PROPAGATION_REQUIRES_NEW,那么当执行到ServiceB.doOther()的时候,ServiceA.doSome()所在的事务就会挂起,ServiceB.doOther()会起一个新的事务,等待ServiceB.doOther()的事务完成以后,他才继续执行。
优先级别:PROPAGATION_REQUIRES_NEW >PROPAGATION_REQUIRES
PROPAGATION_REQUIRED与PROPAGATION_REQUIRED 的事务区别:在于事务的回滚程度。因为ServiceB.doOther()是新起一个事务,那么就是存在两个不同的事务。如果ServiceB.doOther()已经提交,那么ServiceA.doSome()失败回滚,ServiceB.doOther()是不会回滚的。如果ServiceB.doOther()失败回滚,如果他抛出的异常被ServiceA.doSome()捕获,ServiceA.doSome()事务仍然可能提交。
(5)NOT_SUPPORTED ——不支持事务
指定的方法不能在事务环境中执行,若当前存在事务,就将当前事务挂起。
比如ServiceA.doSome()的事务级别是PROPAGATION_REQUIRED ,而ServiceB.doOther()的事务级别是PROPAGATION_NOT_SUPPORTED ,那么当执行到ServiceB.doOther()时,ServiceA.doSome()的事务挂起,而他以非事务的状态运行完,再继续ServiceA.doSome()的事务。一般,在非常耗时查询的时候就可以使用Not Support,挂起这个查询方法,让其他方法先行,避免事务时间超长。
优先级别:PROPAGATION_NOT_SUPPORTED>PROPAGATION_REQUIRED
(6)NEVER ——禁用事务
指定的方法不能在事务环境下执行,若当前存在事务,就直接抛出异常。
假设ServiceA.doSome()的事务级别是PROPAGATION_REQUIRED,而ServiceB.doOther()的事务级别是PROPAGATION_NEVER ,那么ServiceB.doOther()就要抛出异常了。
简而言之:事务掉了拥有NEVER属性的方法统统要出错。
优先级别:PROPAGATION_NEVER>PROPAGATION_REQUIRED
(7)NESTED ——嵌套事务
指定的方法必须在事务内执行。若当前存在事务,则在嵌套事务内执行;若当前没有事务,则创建一个新事务。并且使用savepoint设置事务的回滚点。
那怎么使用savapoint()的,看下面这个例子
savapoint()使用
ServiceA {
void doSome() {
try {
//savepoint
ServiceB.doOther(); //PROPAGATION_NESTED 级别
} catch (SomeException) {
// 执行其他业务, 如 ServiceC.doElse()等等
}
}
}
1
2
3
4
5
6
7
8
9
10
加入,ServiceB.doOther()失败回滚,那么ServiceA.doSome() 也会回滚到savepoint点上,ServiceA.doSome() 可以选择另外一个分支,比如ServiceC.doElse(),继续执行,来尝试完成自己的事务。
PROPAGATION_Nested与PROPAGATION_REQUIRES_NEW的区别是:PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
---------------------
作者:童小绿
from:https://blog.csdn.net/tsj11514oo/article/details/52389124?utm_source=copy
事务457——事务的七个传播行为相关推荐
- 数据事务四种隔离机制和七种传播行为
数据事务四种隔离机制和七种传播行为 一.隔离级别: 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Seria ...
- Spring五个事务隔离级别和七个事务传播行为
Spring五个事务隔离级别和七个事务传播行为 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数 ...
- 事务隔离级别和传播行为_Spring五个事务隔离级别和七个事务传播行为
Isolation 属性一共支持五种事务修改,具体介绍如下: l DEFAULT 使用设置的防护级别 ( 默认 ) ,由 DBA 默认的设定来决定隔离级别 . l READ_UNCOMMITTED 会 ...
- JavaEE进阶 - Spring事务和事务传播机制 - 细节狂魔
文章目录 1.为什么需要事务?(回顾) 2.Spring 中事务的实现 MySQL 中的事务使用(回顾) 1.⼿动操作事务(编程式事务) 2. 声明式事务(利用注解自动开启和提交事务) @Transa ...
- 什么是事务、事务特性、事务隔离级别、spring事务传播特性
1.什么是事务: 事务是指程序中的一个操作序列.其特点是:该序列的所有操作要么全部成功完成,要么只要有一个操作失败,则该序列所有操作都将被撤销.这也是事务的原子性(要么成功,要么失败). 2.事务特性 ...
- Spring高级之Spring事务详解(用法、传播行为、隔离级别、只读事务、事务条件)
前言 这是之前开始学spring的时候的笔记,现在添加了一些理解,然后把他搬到博客上来. 事务概述: 这里仅对数据库事务进行一个概述,要详细的可以查询相关文章 在JavaEE企业级开发的应用领域,为确 ...
- JavaEE_Spring_Spring中的事务声明, 事务隔离和事务传播等
最近面试经常被问到事务的隔离与事务传播等方面的知识,现在留下一篇博文整理了网上几篇博文的资料.记录一下 0.Spring中的事务以及事务声明 这里只讲解Spring中的事务,对于SQL事务的概念以及A ...
- 分布式事务最经典的七种解决方案
作者:叶东富 来源:https://segmentfault.com/a/1190000040321750 随着业务的快速发展.业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微 ...
- 技术圈儿001---分布式事务最经典的七种解决方案
随着业务的快速发展.业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构.随之而来就必然遇到分布式事务这个难题,这篇文章总结了分布式事务最经典的解决方案,分享给大家. ◆ ...
最新文章
- 拿下中科大的计算机课程全靠它了!
- 零基础如何学好Python?Python有哪些必须学的知识?
- VTK:Shaders之ColorByNormal
- 智能机器人建房子后房价走势_明后年日照房价走势如何?究竟是“上涨”还是下降...
- linux之用2张图片描述vim常见命令
- 微信H5 回调_PHP实现微信H5支付
- windows查询每个线程占用的内存_C#多线程
- 微信公众号开发之创建菜单栏代码示例(php)
- 2台电脑一根网线传文件_黑龙江工程专用网线报价,黑电源线配件厂家
- TextBar for Mac(菜单栏增强工具)支持m1
- 2019年末逆向复习系列之从猫眼字体反爬分析谈谈字体反爬的前世今生
- 官方指南:小米手机微信双开
- 1016 Phone Bills (25分)
- 42个5G智慧教育应用场景,告诉你5G将如何改变教育
- 写在2016的尾巴上
- 关于7Z自解压文件拆分,读取条目,复写,合并的功能
- 生成数字相加验证码图片并验证
- Luogu P4844 LJJ爱数数
- 迁移率 计算方法及用途 风控建模系列 02
- 有没有办法找回testflight之前测试的软件_关于TestFlight ,你需要知道这些
热门文章
- spring mvc DispatcherServlet详解前传---HttpServletBean类
- Hudson-ci/Using Hudson/Installing Hudson/Installing Hudson RPM--官方文档
- 【大数据-Hadoop】Spark
- 巨杉数据库 CTO 王涛:区块链+数据库,底层技术融合是否带来更大爆发?
- 京东发力金融AI,欲再招50位金融AI顶级科学家 转载 2017年12月04日 00:00:00 42 12月1日,京东金融AI实验室在美国硅谷正式投入运营。亦在同一天,京东金融宣布,美国伊利诺伊大
- 深入理解分布式技术 - 如何确保高可用
- 饿了吗app都是用html写的,Vue2.0仿饿了么webapp单页面应用详细步骤
- php 限制登陆设备,登陆界面限制到只允许一台机器在线-PHP教程,PHP应用
- Android系统system文件夹结构的说明 \system下的app、lib、bin、etc、fonts、framework
- pyqt5教程9:Widgets组件