Spring 事物传播特性

Spring 事物传播特性

这是Spring官方的定义 一共有7种 摘自源码省略了一部分

public interface TransactionDefinition {int PROPAGATION_REQUIRED = 0;int PROPAGATION_SUPPORTS = 1;int PROPAGATION_MANDATORY = 2;int PROPAGATION_REQUIRES_NEW = 3;int PROPAGATION_NOT_SUPPORTED = 4;int PROPAGATION_NEVER = 5;int PROPAGATION_NESTED = 6;
}
ROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。 
PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。 
PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。 
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。 
PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作

前面6个都非常好理解,只有 PROPAGATION_NESTED 这个传播特性容易让人搞混淆,所以这里特别说明一下。

PROPAGATION_REQUIRES_NEW starts a new, independent "inner" transaction for the given scope. This transaction will be committed or rolled back completely independent from the outer transaction, having its own isolation scope, its own set of locks, etc. The outer transaction will get suspended at the beginning of the inner one, and resumed once the inner one has completed. Such independent inner transactions are for example used for id generation through manual sequences, where the access to the sequence table should happen in its own transactions, to keep the lock there as short as possible. The goal there is to avoid tying the sequence locks to the (potentially much longer running) outer transaction, with the sequence lock not getting released before completion of the outer transaction. PROPAGATION_NESTED on the other hand starts a "nested" transaction, which is a true subtransaction of the existing one. What will happen is that a savepoint will be taken at the start of the nested transaction. íf the nested transaction fails, we will roll back to that savepoint. The nested transaction is part of of the outer transaction, so it will only be committed at the end of of the outer transaction. Nested transactions essentially allow to try some execution subpaths as subtransactions: rolling back to the state at the beginning of the failed subpath, continuing with another subpath or with the main execution path there - all within one isolated transaction, and not losing any previous work done within the outer transaction. For example, consider parsing a very large input file consisting of account transfer blocks: The entire file should essentially be parsed within one transaction, with one single commit at the end. But if a block fails, its transfers need to be rolled back, writing a failure marker somewhere. You could either start over the entire transaction every time a block fails, remembering which blocks to skip - or you mark each block as a nested transaction, only rolling back that specific set of operations, keeping the previous work of the outer transaction. The latter is of course much more efficient, in particular when a block at the end of the file fails. 

主要看绿色这段话,大概意思是说 PROPAGATION_NESTED 开始一个 "嵌套的" 事务,  它是已经存在事务的一个真正的子事务. 潜套事务开始执行时,  它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交. 

说到这大家可能已经清楚这个传播特性是干啥的了,其实就是利用了数据库的还原点的原理,底层还是通过设置Connection.setSavepoint() 与数据库打交道。

    ServiceA {/*** 事务属性配置为 PROPAGATION_REQUIRED*/void methodA() {try {//事务属性配置为 PROPAGATION_NESTEDServiceB.methodB(); //如果methodB()方法出现异常,则回滚方法B的所有SQL操作} catch (SomeException) {// 执行其他业务, 如 ServiceC.methodC();
            }}}

 

转载一遍文章讲解的也很详细

http://www.iteye.com/topic/35907

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6月,回忆我失去的爱情

6月,夏天早已到来 自4月起,我一直放荡着。这个我在上个文章里已提到,哈哈 放荡两个月后,我回想我自己的爱情 我想明白为什么我会失去自己的爱情,哈哈 终于明白了是为什么,其实失去的这样的简单 我承认我有错…

《你必须知道的.NET》第1章学习笔记

面向对象中几个最基本的概念:类,对象,继承,封装和多态。 对象的出生,只是完成了对必要字段的初始化,其他数据要通过后面的操作来完成,如:属性的赋值,通过方法获取必要信息…

利用 PGO 提升 .NET 程序性能

引子.NET 6 开始初步引入 PGO。PGO 即 Profile Guided Optimization,通过收集运行时信息来指导 JIT 如何优化代码,相比以前没有 PGO 时可以做更多以前难以完成的优化。下面我们用 .NET 6 的 nightly build 版本 6.0.100-rc.1.21377.6 来试试新的 PGO。PG…

不作死就不会死,盘点那些死于自己发明的发明家

全世界只有3.14 %的人关注了青少年数学之旅还有他们死于自己的发明发明呼吸器:缺氧死亡 1772年,法国人希厄尔弗莱米奈特发明了可用于潜水的循环式再呼吸器,让呼出的气体实现循环。这是世界上第一个自持呼吸装置。不幸的是,弗莱米奈…

CIO们对数据中心虚拟化心存的六大疑虑

本文摘自:[url]http://industry.ccidnet.com/art/3915/20070428/1072803_1.html[/url] 巴塞罗那超级计算中心 数据中心虚拟化正在势不可挡地迅猛发展,据IDC预测,到2009年,虚拟化市场将在全球范围内将增长150亿美元。有专家预言&am…

启动Tomcat一闪而过解决

打开apache-tomcat-6.0.32/bing/catalina.bat在首行添加: set JAVA_HOMEC:\Program Files\Java\jdk1.6.0_07 就可以了。

android gdb 远程调试工具,Android下用gdb远程调试办法

Host: ubuntuTarget: Android ICS1. 将gdbserver和gdbclient分别放入target和host。两者都可在android源代码的prebuilt目录下找到。2. 在Target上启动gdbserver,在adb shell中执行$ /path/to/gdbserver :1111--attach PID其中PID为想要debug程序的进程号&#xff0…

如何在Domino中使用文本文件注册用户

具体的步骤如下: 1。先用以下的格式创建一个文本文件(每个用户一行): ZhangSan;;;;passw0rd;e:\id\603server;zhangsan.id;603server/r6domain;;zhangsan.nsf;;;;;;;;;;;; LiSi;;;;passw0rd;e:\id\603server;lisi.id;603server/r6domain;;lis…

C# 对接微信支付时生成符合 RFC3339 标准的日期时间字符串

rfc3339 是一种包含时区信息的字符串标准格式。格式为YYYY-MM-DDTHH:mm:ssTIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(08:00表示东八区时间&…

盘点那些世间顶级直男hhhhhh | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅【1】【2】【3】【4】【5】【6】【7】【8】【9】

android的单选按钮xml语法,android 控件 单项选择(RadioGroup,RadioButton)

1、继承关系和子类:2、定义:RadioButton表示单个圆形单选框,而RadioGroup是可以容纳多个RadioButton的容器3、XML重要属性:4、重要方法:5、实战:布局文件android:layout_width"wrap_content"andr…

.net项目开发工具(v2.0)功能完善专帖

首先,感谢你对本软件的支持。如果你有好的建议和要求,请记录于此,谢谢! 原文:http://www.cnblogs.com/mrhgw/archive/2007/06/04/770278.html?Pendingtrue#Post

CVE(Common Vulnerabilities and Exposures通用漏洞披露)笔记

产生背景:目前实时入侵检测和漏洞扫描评估基于的主要方法还是“已知入侵手法检测”和“已知漏洞扫描”,即基于知识库的技术,因此决定一个IDnA(Intrusion Detection and Assessment 实时入侵检测和漏洞扫描评估)技术和产…

[006] 了解 Roslyn 编译器

维基百科对编译器的解释是:编译器是一种程序,它将某种编程语言编写的源代码(原始语言)转换成另一种编程语言(目标语言)。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。在 .NET 平台中&a…

arcengine 将地图文件保存为图片(包括各种图片格式)

1,最近做了个地图文件输出图片的功能,思想主要就是利用MapControl的ActiveView中的out方法: 2代码如下:欢迎交流指正 1 SaveFileDialog m_save new SaveFileDialog();2 m_save.Filter "jpeg图片(*…

这个让人看跪了的设计!实力证明,数学才是世界的最终boss!

全世界只有3.14 %的人关注了青少年数学之旅最近,有不少购买了年度数学艺术礼盒《数学之旅闪耀人类的54个数学家》的小伙伴,已经按捺不住内心的激动:但超模君秉承着“慢工出细活”的态度,多次亲自到工厂对扑克牌的细节进行把关&…

android 版本28 通知栏图标,【专题分析】应用图标、通知栏适配

# 应用图标适配## 新规范Android8.0开始,应用程序的图标分为了两层:前景层和背景层,前景用来展示应用图标的Logo,背景用来衬托应用图标的Logo,(背景层在设计的时候只允许定义颜色和纹理,但是不能定义形状)。…

win2000/xp/2003 错误代码

10009 0x2719 提供的文件句柄无效。 10013 0x271D 以一种访问权限不允许的方式做了一个访问套接字的尝试。 10014 0x271E 系统检测到在一个调用中尝试使用指针参数时的无效指针地址。 10022 0x2726 提供了一个无效的参数。 10024 0x2728 打开的套接字太多。 10035 0x2733 无法立…

[007] 详解 .NET 程序集

上一篇我们介绍了 Roslyn 编译器,我们知道,我们编写的 C#/VB 代码经过 Roslyn 编译器编译后会生成程序集文件。按照之前讲的 .NET 执行模型的顺序,这一篇我具体讲讲程序集。1什么是程序集我们编写的 C# 代码经过编译会生成 .dll 或 .exe 文件…

ueditor 编辑器再thinkphp中使用 解决转义问题

在前台common.php文件中加入下面的函数就可以解决了 <?php //取消thinkphp里面的转义 if (get_magic_quotes_gpc()) {function stripslashes_deep($value){$value is_array($value) ?array_map(stripslashes_deep, $value) :stripslashes($value);return $value;}$_POST…