Spring嵌套事务控制
A类 callBack_test()
B类 testadd()
C类 select(),得查询到B类testadd方法中新增的数据。以及初始化一些属性
场景:A类 嵌套 B类 B类嵌套C类;都是由spring控制事务。
要求:B类testadd方法中不受spring事务控制,单独新开个事务运行,可以使C类查询的到。
问题:A类是系统底层方法,必须受事务控制。且C类必须查询到刚刚add的数据。
分析:初步分析为:Spring事务传播性导致的,从A类开启的事务,就有完结。为了避免这样的情况。最好将相关类。不要让spring控制事务。
解决:B类中testadd()方法显示开启事务。方法例如以下:
//testadd方法中数据不受事务控制(要求:是否下发成功。不影响兴许代码运行;因此要开启一个新事务)
//开启新事务,防止跟其它事务混淆
DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) SpringContextFactory
.getBean("transactionManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //事物隔离级别,开启新事务,与A类和B类不使用同一个事务。
TransactionStatus status = transactionManager.getTransaction(def); //获得事务状态
try{
**************代码逻辑****************
transactionManager.commit(status);
}catch (Exception e) {
// TODO: handle exception
transactionManager.rollback(status);
}
补充:
将B类中testadd方法配置成不让spring事务控制,testadd方法显示开启事务。手动提交。
尝试:
将B类的testadd方法增加spring事务控制中,且配置事务级别为PROPAGATION_REQUIRES_NEW,
不起作用,原因是直接把当前事务给挂起了
- PROPAGATION_REQUIRED:假设当前没有事务,就新建一个事务,假设已经存在一个事务,就增加到这个事务中。
这是最常见的选择。
- PROPAGATION_SUPPORTS:支持当前事务,假设当前没有事务。就以非事务方式运行。
- PROPAGATION_MANDATORY:使用当前的事务,假设当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW:新建事务,假设当前存在事务,把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED:以非事务方式运行操作,假设当前存在事务。就把当前事务挂起。
- PROPAGATION_NEVER:以非事务方式运行。假设当前存在事务。则抛出异常。
- PROPAGATION_NESTED:假设当前存在事务,则在嵌套事务内运行。假设当前没有事务,则运行与PROPAGATION_REQUIRED类似的操作
2. 备注:
疑问:怎样手动提交spring管理的事务?注:spring事务级别是PROPAGATION_REQUIRED
答案:首先在类開始部分。开启一个事务,事务的隔离级别假设是PROPAGATION_REQUIRED。手动提交事务不起作用。
事务的隔离级别须要配置成.PROPAGATION_REQUIRES_NEW。手动提交事务才干起作用。
//开启新事务,防止跟其它事务混淆
DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) SpringContextFactory
.getBean("transactionManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //事物隔离级别,开启新事务,与A类和B类不使用同一个事务。
TransactionStatus status = transactionManager.getTransaction(def); //获得事务状态
參考引用:http://blog.csdn.net/ziyunlong1984/article/details/7725585
http://blog.chinaunix.net/uid-10289334-id-2964925.html
http://blog.csdn.net/hy6688_/article/details/44763869
Spring嵌套事务控制的更多相关文章
- 【Spring】Spring 事务控制
Spring 事务控制 Spring 事务控制介绍 JavaEE 体系进行分层开发,事务控制位于业务层,Spring 提供了分层设计业务层的事务处理解决方案. Spring 的事务控制都是基于 AOP ...
- Spring Security控制权限
Spring Security控制权限 1,配置过滤器 为了在项目中使用Spring Security控制权限,首先要在web.xml中配置过滤器,这样我们就可以控制对这个项目的每个请求了. < ...
- Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)
关于依赖注入, 这篇博文写的非常简单易懂. https://github.com/android-cn/blog/tree/master/java/dependency-injection 此外, 博 ...
- 转:spring 的控制反转
文章一,原文地址:http://blog.sina.com.cn/s/blog_63804f6f0100kfx0.html 控制反转: IoC(Inversion of Control,控 ...
- 【SSH】——spring的控制反转和依赖注入
spring是一个轻量级的容器框架,主要是为了使企业的开发变得简单.高效.无论是从大小还是开销来讲,他都可以算是轻量级的,也是非侵入性的. 下图是spring的框架示意图,说到spring,就不得不提 ...
- Spring的控制反转(IOC)和依赖注入(DI)具体解释
Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...
- Spring IoC控制反转创建实例
Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...
- SSM框架之Spring(5)JdbcTemplate及spring事务控制
Spring(5)JdbcTemplate及spring事务控制 ##1.JdbcTmeplate 它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.spring ...
- spring security控制session
spring security控制session本文给你描述在spring security中如何控制http session.包括session超时.启用并发session以及其他高级安全配置. 创 ...
随机推荐
- laravel知识点备忘
1.连表查询:select * from goods left join shop on goods.shopid=shop.shopid; DB::table('goods') ->leftJ ...
- tensorflow with gpu 环境配置
1.准备工作 1.1 确保GPU驱动已经安装 lspci | grep -i nvidia 通过此命令可以查看GPU信息,测试机已经安装GPU驱动
- 【HIHOCODER 1049】 后序遍历
描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具--一棵由小球和木棍连接起来的二叉树! 小Ho对这棵二叉树爱不释手,于是给它的每一个节 ...
- 线性结构4 Pop Sequence
02-线性结构4 Pop Sequence(25 分) Given a stack which can keep M numbers at most. Push N numbers in the or ...
- Git 二进制文件冲突解决
Git 二进制文件冲突解决 在我们合并分支的时候,如果两个分支都进行了修改那么就会产生合并冲突.对于非二进制文件的冲突解决,git会给出冲突的位置我们可以手动修改然后再commit.但是对于非二进制文 ...
- 《Shell脚本学习指南》书籍目录
摘要:Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更 ...
- [luoguP1773] 符文之语_NOI导刊2010提高(02)(DP)
传送门 f[i][j]表示前i个数余数为j的最优解 sum[i][j]表示字符串i~j所构成的数 #include <cstdio> #include <cstring> #d ...
- 【01背包变形】Robberies HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...
- 关于NSArray的去重
提到去重,第一反应就是for或while循环来遍历处理. 然后有了几种思路: 1) 两个循环嵌套 对比 然后去重: 但是这种方法会数据丢失, arr为要去重的数组 ; i<arr.count; ...
- Can you answer these queries(spoj 1043)
题意:多次查询区间最长连续字段和 /* 用线段树维护区间最长子段和,最长左子段和,最长右子段和. */ #include<cstdio> #include<iostream> ...