文档章节

关于PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED事务的比较

Barudisshu
 Barudisshu
发布于 2016/03/07 12:26
字数 449
阅读 159
收藏 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
粉丝 27
博文 62
码字总数 70723
作品 0
茂名
程序员
解惑 spring 嵌套事务

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

jason_wu_2
2016/11/08
5
0
Spring嵌套事务解惑(重点)

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

码代码的小司机
07/01
0
0
spring事务PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED区别

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

vshcxl
2016/11/30
28
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

没有更多内容

加载失败,请刷新页面

加载更多

原型模式

1、原型模式-定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 克隆(浅度克隆->拷贝值类型或者引用,深度克隆->创建新的对象,开辟新的内存) 例如客户端知道抽象Pro...

阿元
今天
58
0
awk命令扩展使用操作

awk 中使用外部shell变量 示例1 [root@centos01 t1022]# A=888[root@centos01 t1022]# echo "" | awk -v GET_A=$A '{print GET_A}'888[root@centos01 t1022]# echo "aaaaaaaaaaaaa" | aw......

野雪球
今天
50
0
深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
今天
54
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
今天
59
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
54
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部