spring执行事务提交后进行一些逻辑操作
在使用spring事务时,我们通常会把事务内的所有操作当成是一个原子操作。也就是当整个事务内的所有代码都执行完成后, 才会将所有的数据落实到数据库中。这样做有时也会给我们造成麻烦。比如以下场景:
根据图中描述的逻辑,如果我们把前两步封装到一个事务方法中,会造成当第三方服务回调我们服务时,我们根据id去查询记录时,发现记录不存在。
这说明,我们第一步执行的方法并没有生效。原因就是因为第1步和第2步同时存在于一个事务中,所以当执行第二步时, 数据库并没有生效,而此时,
第三方服务如果处理比较快的时候,会立即回调我们,造成我们库里面查不到数据的情况。
解决方案:我们可以让第二步在第一步完全执行完成之后再去执行,这个时候就需要用到事务后提交操作。
demo:
在事务方法中写入如下代码:decisionService.restdecision(bestbuyOrder);就是我们图中所说的步骤2.这样就可以保证在步骤1完全入库后再执行步骤2.这样再查询就不会出现查不到的情况了。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
decisionService.restdecision(bestbuyOrder);
}
});
spring执行事务提交后进行一些逻辑操作的更多相关文章
- Transactional事务提交后触发异步方法
一.问题复现 1.场景 2个service方法, 方法A中调用方法B. 方法A 是核心业务方法,涉及多张表数据变更,为了保持数据一致,用spring事务注解:@Transactional(rollba ...
- 数据库事务的隔离以及spring的事务传播机制
数据库的事务隔离: MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”RR(REPEATABLE READ). oracle默认的是提交读.RC 未提交读(READ UNCOMMITTE ...
- 【spring源码学习】spring的事务管理的源码解析
[一]spring事务管理(1)spring的事务管理,是基于aop动态代理实现的.对目标对象生成代理对象,加入事务管理的核心拦截器==>org.springframework.transact ...
- Spring AOP事务管理(使用切面把事务管理起来)
在<Spring Transaction 分析事务属性(事务的基本概念.配置)>基础上 http://blog.csdn.net/partner4java/article/details/ ...
- spring 实现事务配置的方式
spring 中常用的两种事务配置方式以及事务的传播性.隔离级别 一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2. ...
- 【Spring】事务(transactional) - REQUIRES_NEW在JdbcTemplate、Mybatis中的不同表现
环境 数据库: oracle 11g JAR: org.springframework:spring-jdbc:4.3.8.RELEASE org.mybatis:mybatis:3.4.2 概念 R ...
- mysql源码解读之事务提交过程(二)
上一篇文章我介绍了在关闭binlog的情况下,事务提交的大概流程.之所以关闭binlog,是因为开启binlog后事务提交流程会变成两阶段提交,这里的两阶段提交并不涉及分布式事务,当然mysql把它称 ...
- mysql源码解读之事务提交过程(一)
mysql是一种关系型数据库,关系型数据库一个重要的特性就是支持事务,这是区别于no-sql产品的一个核心特性.当然了,no-sql产品支持键值查询,不能支持sql语句,这也是一个区别.今天主要讨论下 ...
- mysql 事务提交过程
打开binlog选项后,执行事务提交命令时,就会进入两阶段提交模式.两阶段提交分为prepare阶段和commit两个阶段.流程如下 :这里面涉及到两个重要的参数:innodb_flush_log_ ...
随机推荐
- perl -p -i -w -e
.txt kllk nciuwbufcbew``````//.]];s[[..; klklkl x,dsncdk,;l,ex xw,eocxmcmck .txt .txt kkkkkkkkkkkkkk ...
- 4G 内存 怎么只有2.99G可用
32为系统只可以识别3.25G,而且有256M的内存被显卡共享显存了,所以只剩2,99G.
- TreeMap 底层是红黑树 排序是根据key值进行的 添加元素时异常 Comparable异常 Comparator比较自定义对象放在键的位置
package com.swift; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; ...
- C#:CodeSmith根据数据库中的表创建C#数据模型Model + 因为没有钱买正版,所以附加自己写的小代码
对于C#面向对象的思想,我们习惯于将数据库中的表创建对应的数据模型: 但假如数据表很多时,我们手动增加模型类会显得很浪费时间: 这个时候有些人会用微软提供的EntityFrameWork,这个框架很强 ...
- JavaScript Dom编程艺术(1)
Dom是一种可以供多种环境和多种程序设计语言使用的API: 一份文档就是一个节点树: 节电分为不同的类型:元素节点,属性节点,文档节点,元素节点分为属性节点和文档节点: getelementbyid( ...
- Linux菜鸟起飞之路【九】系统启动流程
Linux系统启动流程 BIOS -> MBR -> BootLoader -> Kernel -> init 1.打开电源后,计算机从主板的BIOS中读取其中存储的程序.这 ...
- Eclipse将java项目导出可执行的jar文件
1.在java项目上右键,点击“Export”,会弹出一个选择导出的文件类型 版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址:https://www.cnblogs.com/poter ...
- Vue基础指令集锦
v-model双向绑定数据 <input type="text" v-model="msg"> {{msg}} ###v-on 事件 <div ...
- mysql的字符串连接符
以前用SQL Server 连接字符串是用“+”,现在数据库用mysql,写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作 ...
- Python基础——集合(set)
集合可以去除掉列表中重复的元素. 创建 list1=[123,123,456,789] list1=set(list1) list1 set1=set() type(set1) set1=set([1 ...