spring中怎么让事物提交_Spring怎么在一个事务中开启另一个事务
点击上方“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怎么在一个事务中开启另一个事务相关推荐
- Spring 如何在一个事务中开启另一个事务?
Spring项目,需要在一个事务中开启另一个事务. 上面提到的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两个方法, ...
- 【正则表达式高级day01】正则表达式概述+在一个文件中,查找出itcast开头的语句+在一个文件中,找到含有itcast的语句+在一个文件中,找到邮箱为163或者126的所有邮件地址
文章目录 正则表达式概述 思考 场景1:在一个文件中,查找出itcast开头的语句 场景:在一个文件中,找到含有itcast的语句 场景:在一个文件中,找到邮箱为163或者126的所有邮件地址 正则表 ...
- (java)创建两个线程,在一个线程中打印输出1-100以内的偶数,在一个线程中输出1-100以内的奇数.
两个线程测试: package com.ffyc.javaThread.dem1;public class Test {public static void main(String[] args) { ...
- 注解mysql事物管理_Spring 使用注解方式进行事务管理
事务的传播行为和隔离级别 大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅. 事物注解方式: @Transactional 当标于类 ...
- 一个事务中 可以查询自己未提交的数据吗_数据库事务的方方面面
事务 是关系型数据的一个重要特性,但很少有人能对事务有全面性的了解,这篇文章就把事务的方方面面讲给你. 事务的概念 什么是事务 数据库事务(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的 ...
- 一个事务中 可以查询自己未提交的数据吗_数据库事务
一 数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这 ...
- spring事务配置,声明式事务管理和基于@Transactional注解的使用
事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring提供了几个关于事务处理的类: TransactionDefinition //事务属性定义 Transc ...
- Spring事务和Aspects框架管理事务,看这篇就够了!(简单易懂!)
Spring事务和Aspects框架管理事务的用法 一.事务的介绍 1.1什么是事务 1.2事务的四大特性 二.事务的隔离级别以及导致的问题介绍 2.1隔离级别介绍 2.2导致的问题介绍 2.2.1脏 ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理(转)
摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...
最新文章
- 生成对抗网络学习笔记5----DCGAN(unsupervised representation learning with deep convolutional generative adv)的实现
- Spring 三种注入方式
- Robots.txt 协议详解及使用说明
- 为Windows 服务器网络搬家
- 拒绝PPT手机?魅族首款真无孔手机将开启众筹
- 特征提取方法: one-hot 和 TF-IDF
- 遇到Io阻塞时会切换任务之【爬虫版】
- js 如何在浏览器中获取当前位置的经纬度
- handsontable的单元格操作方法
- simhash与minhash
- 电脑java编译器软件下载,JDK官方网站下载安装教程 JAVA编译器
- h5、app、小程序 互相跳转打开的方式总结
- Netd 中 NetworkManager 分析
- 51单片机制作简易计算器(动态数码管、矩阵按键)
- outlook2007 有一个程序正试图以您的名义自动发送电子邮件
- php path_info orig_path_info
- NW.js开发环境搭建
- AndroidStudio 个人总结的快捷键
- linux usb 批量传输文件,一种Linux系统下提升usb批量传输速度的方法及系统与流程...
- 21个经典故事,值得收藏
热门文章
- KubeCon 2018 参会记录 —— FluentBit Deep Dive
- 全民营销时代,让私域流量变成业务增量需要几步?
- 没错,你离分布式搜索只差一个Elasticsearch入门!
- 996!007!同是敲了2万行代码,为什么他却晋升了?
- 轻松了解面试官心理!ElasticSearch写入数据的工作原理是什么? | 技术头条
- 云漫圈 | 什么是微服务?
- shell脚本报错“^M: bad interpreter”解决方法
- ORACLE JDBC 对千万数据 批量删除和批量插入
- 本地安装Docker
- python获取路径下所有文件_Python获取路径下所有文件名