点击上方“Java知音”,选择“置顶公众号”

技术文章第一时间送达!

作者:Mazin

my.oschina.net/u/3441184/blog/893628

Spring项目,需要在一个事务中开启另一个事务。

上面提到的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两个方法,也就是将两个操作的事务分开。

但是这只适用于业务比较简单的,如果出现多次数据库的写操作,而我们调用的系统只需要其中一个写操作的最新数据,如果我们将它分开,那么如果调用目标系统出现异常的时候,那么之前的写操作就不能回滚了。

举个简单的例子:

@Servicepublic class ServiceA {

    @Transactional    public void doSomething(){

        向数据库中添加数据;

        调用其他系统;    }}

这里就用伪代码来做示例了,当我们执行了“向数据库中添加数据”,我们去数据库中查询,发现并没有我们添加的数据,但是当我们的service这个方法执行完成之后,数据库中就有这条数据了,这是由于数据库的隔离性造成的。

spring中的事务注解@transactional提供了一个参数:

Propagation propagation() default Propagation.REQUIRED;

这个参数是定义spring事务的传递性的,默认值为required,也就是如果有事务,就加入事务,如果没有,就创建事务。这个参数的值有很多,例如REQUIRES_NEW,这个值就代表创建一个新的事务,与原来的事务分开。这个好像能解决我们的问题。

我们将刚刚那个方法修改一下:

@Servicepublic class ServiceA {

    @Transactional    public void doSomething(){

        insert();

        调用其他系统;    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)    public void insert(){        向数据库中添加数据;    }}

执行之后,发现结果还是没有改变,必须要整体执行完成,数据库中数据才会出现,说明还是在一个事务中。

我们再将代码修改一下:

@Servicepublic class ServiceA {

    @Autowired    private ServiceB serviceB;    @Transactional    public void doSomething(){

        serviceB.insert();

        调用其他系统;    }}
@Servicepublic class ServiceB {

    @Transactional(propagation = Propagation.REQUIRES_NEW)    public void insert(){        向数据库中添加数据;    }}

我们将要事务分离出来的方法写在另一个service中,再次测试,发现执行完插入语句之后,数据库中就已经能查到数据了,说明事务分离了,完成了我们的需求。

当然spring其实也考虑这个,在spring的配置中,我们只需要添加标签  或者  ,并且在代码的调用中要求使用代理对象去调用即可:

((ServiceA ) AopContext.currentProxy()).insert();

END

Java面试题专栏

【30期】说一下HashMap的实现原理?【29期】Java集合框架 10 连问,你有被问过吗?【28期】ZooKeeper面试那些事儿【27期】Dubbo面试八连问,这些你都能答上来吗?【26期】如何判断一个对象是否存活?(或者GC对象的判定方法)?【25期】这三道常见的面试题,你有被问过吗?【24期】请你谈谈单例模式的优缺点,注意事项,使用场景【23期】请你谈谈关于IO同步、异步、阻塞、非阻塞的区别【22期】为什么需要消息队列?使用消息队列有什么好处?【21期】你能说说Java中Comparable和Comparator的区别吗

我知道你 “在看

spring中怎么让事物提交_Spring怎么在一个事务中开启另一个事务相关推荐

  1. Spring 如何在一个事务中开启另一个事务?

    Spring项目,需要在一个事务中开启另一个事务. 上面提到的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两个方法, ...

  2. 【正则表达式高级day01】正则表达式概述+在一个文件中,查找出itcast开头的语句+在一个文件中,找到含有itcast的语句+在一个文件中,找到邮箱为163或者126的所有邮件地址

    文章目录 正则表达式概述 思考 场景1:在一个文件中,查找出itcast开头的语句 场景:在一个文件中,找到含有itcast的语句 场景:在一个文件中,找到邮箱为163或者126的所有邮件地址 正则表 ...

  3. (java)创建两个线程,在一个线程中打印输出1-100以内的偶数,在一个线程中输出1-100以内的奇数.

    两个线程测试: package com.ffyc.javaThread.dem1;public class Test {public static void main(String[] args) { ...

  4. 注解mysql事物管理_Spring 使用注解方式进行事务管理

    事务的传播行为和隔离级别 大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅. 事物注解方式: @Transactional 当标于类 ...

  5. 一个事务中 可以查询自己未提交的数据吗_数据库事务的方方面面

    事务 是关系型数据的一个重要特性,但很少有人能对事务有全面性的了解,这篇文章就把事务的方方面面讲给你. 事务的概念 什么是事务 数据库事务(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的 ...

  6. 一个事务中 可以查询自己未提交的数据吗_数据库事务

    一 数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这 ...

  7. spring事务配置,声明式事务管理和基于@Transactional注解的使用

    事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring提供了几个关于事务处理的类: TransactionDefinition //事务属性定义 Transc ...

  8. Spring事务和Aspects框架管理事务,看这篇就够了!(简单易懂!)

    Spring事务和Aspects框架管理事务的用法 一.事务的介绍 1.1什么是事务 1.2事务的四大特性 二.事务的隔离级别以及导致的问题介绍 2.1隔离级别介绍 2.2导致的问题介绍 2.2.1脏 ...

  9. 全面分析 Spring 的编程式事务管理及声明式事务管理(转)

    摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...

最新文章

  1. 生成对抗网络学习笔记5----DCGAN(unsupervised representation learning with deep convolutional generative adv)的实现
  2. Spring 三种注入方式
  3. Robots.txt 协议详解及使用说明
  4. 为Windows 服务器网络搬家
  5. 拒绝PPT手机?魅族首款真无孔手机将开启众筹
  6. 特征提取方法: one-hot 和 TF-IDF
  7. 遇到Io阻塞时会切换任务之【爬虫版】
  8. js 如何在浏览器中获取当前位置的经纬度
  9. handsontable的单元格操作方法
  10. simhash与minhash
  11. 电脑java编译器软件下载,JDK官方网站下载安装教程 JAVA编译器
  12. h5、app、小程序 互相跳转打开的方式总结
  13. Netd 中 NetworkManager 分析
  14. 51单片机制作简易计算器(动态数码管、矩阵按键)
  15. outlook2007 有一个程序正试图以您的名义自动发送电子邮件
  16. php path_info orig_path_info
  17. NW.js开发环境搭建
  18. AndroidStudio 个人总结的快捷键
  19. linux usb 批量传输文件,一种Linux系统下提升usb批量传输速度的方法及系统与流程...
  20. 21个经典故事,值得收藏

热门文章

  1. KubeCon 2018 参会记录 —— FluentBit Deep Dive
  2. 全民营销时代,让私域流量变成业务增量需要几步?
  3. 没错,你离分布式搜索只差一个Elasticsearch入门!
  4. 996!007!同是敲了2万行代码,为什么他却晋升了?
  5. 轻松了解面试官心理!ElasticSearch写入数据的工作原理是什么? | 技术头条
  6. 云漫圈 | 什么是微服务?
  7. shell脚本报错“^M: bad interpreter”解决方法
  8. ORACLE JDBC 对千万数据 批量删除和批量插入
  9. 本地安装Docker
  10. python获取路径下所有文件_Python获取路径下所有文件名