文档章节

关于PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED事务的比较

Barudisshu
 Barudisshu
发布于 2016/03/07 12:26
字数 449
阅读 140
收藏 0
点赞 1
评论 0
最近在用spring-data-jpa做事务处理时,由于两个事务都处理了同一个表,其中一个事务加锁,另外一个事务不加锁,于是在调用的另外一个事务中使用了嵌套的方式,但是运行却报
JpaDialect does not support savepoints - check your JPA provider's capabilities

后经查实,原来Hibernate/JPA并不能实现嵌套事务,嵌套事务仅仅在JDBC级别支持,对于Hibernate/JPA要实现嵌套事务,也仅仅在dialect为Oracle的情况下才完全实现。

那怎么办?那当然是使用JDBC事务控制咯,因此你可以使用JdbcTemplate或者mybatis数据库框架进行控制。

<tx:annotation-driven  transaction-manager="transactionManager"/>   
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
    <property name="dataSource" ref="dataSource"></property>  
</bean>

这个时候,只需要在方法上添加@Transactional(propagation=Propagation.NESTED)注解或者在aop配置切面即可。

那么,为什么不用REQUIRES_NEW呢,这两者有什么不同?

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. ... 
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.
按字面上的理解就是,requires_new是独立的,运行的时候自己提交,不受外部事务调用的控制;而nested,顾名思义,“嵌套的”,即存在外部事务时,会作为外部事务的一部分,自身发生异常将连带外部事务进行回滚。





© 著作权归作者所有

共有 人打赏支持
Barudisshu
粉丝 26
博文 62
码字总数 70723
作品 0
茂名
程序员
解惑 spring 嵌套事务

/** * @author 王政 * @date 2006-11-24 * @note 转载请注明出处 */ 在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看, 绝大多数人并不能深刻...

jason_wu_2
2016/11/08
5
0
spring事务PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED区别

解惑 spring 嵌套事务 在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看, 绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义...

vshcxl
2016/11/30
28
0
Spring嵌套事务解惑(重点)

http://www.iteye.com/topic/35907 PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务...

码代码的小司机
07/01
0
0
Spring声明式事务管理及事务嵌套

一> 事务配置 spring动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使...

vshcxl
2016/11/30
10
0
Spring管理Hibernate事务之事务传播机制

Spring管理Hibernate事务之事务传播机制 public enum Propagation { REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), MAND......

秋风醉了
2015/07/28
425
0
Spring事务的传播行为和隔离级别

7个传播行为,4个隔离级别, Spring事务的传播行为和隔离级别 [ transaction behavior and isolated level ]2007 -08 -01 16 :33事务的传播行为和隔离级别 [ transaction behavior and isola...

wsl_Mr
2013/10/11
0
0
spring事务传播属性与隔离级别

一、Propagation (事务的传播属性) Propagation :   key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用: PROPAGATIONREQUIRED--支持...

海子_枫子
2015/06/30
0
0
Spring声明式事务管理与配置详解

1、Spring声明式事务配置的五种方式   前段时间对Spring的事务配置做了比较深入的研究,在此之前对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的...

只想一个人静一静
2014/02/27
0
0
spring 事务传播性和事务的隔离级别

一、Propagation (事务的传播属性) Propagation :  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATIONREQUIRED--支持当...

LANTIANFEIYING
2016/07/04
0
0
浅谈Spring事务隔离级别

一、Propagation (事务的传播属性) Propagation :  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED--支持当...

mrliuze
2016/03/10
72
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Weblogic问题解决记录

问题:点击登录,页面刷新但是不进去管理界面。解决:删除cookies再登录。

wffger
19分钟前
0
0
RxJava2的错误处理方案

最近使用retrofit2 + rxKotlin2写接口访问,想尽量平铺代码,于是就想到当借口返回的状态码为「不成功」时(比如:code != 200),就连同网络错误一起,统一在onError方法中处理。想法总是好的...

猴亮屏
27分钟前
0
0
程序的调试信息

调试二进制程序时,经常要借助GDB工具,跟踪程序的执行流程,获取程序执行时变量的值,以发现问题所在。GDB能得到这些信息,是因为编译程序时,编译器保存了相应的信息。Linux下的可执行程序...

qlee
50分钟前
0
0
应用级缓存

缓存命中率 从缓存中读取数据的次数与总读取次数的比例,命中率越高越好 java缓存类型 堆缓存 guavaCache Ehcache3.x 没有序列化和反序列化 堆外缓存ehcache3.x 磁盘缓存 存储在磁盘上 分布式...

writeademo
今天
0
0
python爬虫日志(3)find(),find_all()函数

1.一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。 以上代码是一个生态金字塔的简单展示,为了找到第一生产者,第一消费者或第二消费者,可以使用Beautiful Sou...

茫羽行
今天
0
0
java:thread:顺序执行多条线程

实现方案: 1.调用线程的join方法:阻塞主线程 2.线程池 package com.java.thread.test;public class MyThread01 implements Runnable {@Overridepublic void run() {Syste...

人觉非常君
今天
0
0
ElasticSearch 重写IK分词器源码设置mysql热词更新词库

常用热词词库的配置方式 1.采用IK 内置词库 优点:部署方便,不用额外指定其他词库位置 缺点:分词单一化,不能指定想分词的词条 2.IK 外置静态词库 优点:部署相对方便,可以通过编辑指定文...

键走偏锋
今天
19
0
Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
今天
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
今天
42
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部