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

转载于:https://www.cnblogs.com/lxjshuju/p/6914417.html

Spring嵌套事务控制相关推荐

  1. Spring——DAO层、Spring JDBC、Spring事务控制

    目录 一.Spring对持久层技术支持 1.Spring支持的持久层技术 2.Spring JDBC 2.1. JDBCTemplate类 2.2.Spring JDBC CRUD操作 2.3.Spr ...

  2. 关于Spring嵌套事务异常问题

    关于Spring嵌套事务异常问题 异常截图 异常信息: Transaction silently rolled back because it has been marked as rollback- ...

  3. Spring的控制反转(IOC)和依赖注入(DI)具体解释

    Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...

  4. Spring-学习笔记10【Spring事务控制】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  5. Spring IOC(控制反转)思想笔记

    Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 在这里插入图片描述 案例 如 ...

  6. java 事务嵌套_解惑 spring 嵌套事务

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

  7. java-12:spring MVC - 控制反转IOC,依赖注入DI

    学习spring框架之前,先理解几个概念: 1.第一部分:依赖倒置原则 2.第二部分:控制反转,控制反转容器(实例) 3.第三部分:控制反转,控制反转容器(全面理解,面试题) 综合性理解:控制反转(I ...

  8. Spring 的控制反转/依赖注入

    第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...

  9. Spring IOC(控制反转)思想笔记

    Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 案例 如果按照之前javaw ...

最新文章

  1. MySQL 5.5 服务器变量详解(二)
  2. C++中的运算符重载
  3. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十八) 完美精灵之八面玲珑(WPF Only)②...
  4. jquery中的each各种神奇遍历用法
  5. mybatis学习笔记-03-CRUD操作
  6. 18.外部相机校准——刚体变换,变换和旋转,外参数矩阵 测验_3
  7. 【Spark】Spark的一个案例 Encountered removing nulls from dataset or using handleInvalid = “keep“ or “skip“
  8. 生意倒闭的老板基本死于这两个思维
  9. java 单元测试 异步_java - 如何使用CountdownLatch对异步代码进行单元测试同步 - 堆栈内存溢出...
  10. Fuck SELinux :rsyslog无法生成log文件,原来是selinux机制搞的鬼!
  11. idea创建Maven项目后启动报404
  12. Unix网络编程之epoll函数模拟10万客户端链接服务器
  13. php imagick 教程,php imagick蒙版做法
  14. Elasticsearch系列——(1.1)倒排索引原理
  15. Android App开发实战之实现微信记账本(附源码 超详细必看)
  16. RADAR毫米波雷达传感器
  17. Xmind激活版双击文件无法打开的解决方案
  18. NTFS文件系统USN日志
  19. 当你使用笔记本电脑插入公司的局域网后你的wifi功能无法上网了,而且公司局域网没有外网,怎么既可以进公司局域网又可以上外网
  20. 如何关掉苹果iMac开机启动声音

热门文章

  1. SQL 常用数据类型汇总
  2. 汇编中ah,al,ax;es,cs,ds,ss;
  3. 第15章习题解答(二)——《x86汇编语言:从实模式到保护模式》读书笔记41
  4. Qt中 QString 和int,double等的转换
  5. 完全理解NIO Selector
  6. Mybatis Plus为什么提供BaseMapper和IService两个相似CRUD操作的接口?
  7. 深度学习练手项目(二)-----利用PyTorch进行线性回归
  8. DIY Roomba Virtual Wall
  9. Tensorflow Day16 Autoencoder 實作
  10. 干货 | 算法工程师入门第二期——穆黎森讲增强学习(一)