首页 > 其他分享 >事务问题之跨服务获取不到未提交事务的值的解决方法

事务问题之跨服务获取不到未提交事务的值的解决方法

时间:2024-09-13 14:25:26浏览次数:1  
标签:TransactionSynchronizationManager 事务 提交 问题 获取 KEY public

事件背景

在配置流程定义完成后,我们遇到了一个棘手的问题:在提交审批后,某个流程变量无法被获取。简而言之,在服务A中,提交审批事务时,新增数据的主键作为工作流的KEY传递给服务B,但服务B中该KEY值为null。

思考

究竟是什么导致了这个现象?难道是某种神秘力量?

解决过程

首先,我们采取了常规的调试手段——设置断点。在工作流方法处,我们发现返回的新增对象确实有值。进一步查询数据库,却发现该数据并不存在。这引导我们去检查数据库的隔离级别。

官方解释

我们了解到,数据库的隔离级别是 REPEATABLE READ(可重复读),它确保在同一个事务中,多次读取同一数据的结果是一致的,除非数据是被当前事务自己修改的。这意味着,在事务A提交之前,事务B无法看到未提交的插入操作。

问题根源

经过分析,我们发现问题的根本原因是事务未提交。除了这一点,其他可能的原因还包括缓存、延迟更新、数据库触发器等,但由于时间关系,我们没有进一步深入。

解决方案

为了避免这个问题,我们采用了以下方法:

import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

public class MyService {
    public void someTransactionalMethod() {
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                // 回调方法,确保在事务提交后执行
            }
        });
    }
}

在Spring框架中,TransactionSynchronizationManager 是一个用于管理事务同步的组件。通过注册同步操作,我们可以确保在事务的生命周期事件(如事务的开始和结束)中执行特定的操作。这避免了在事务未提交时获取不到KEY值的问题。

当然以上解决的办法以及遇到问题的场景比较片面,后面有时间会拓展一下填上这个坑。

标签:TransactionSynchronizationManager,事务,提交,问题,获取,KEY,public
From: https://www.cnblogs.com/liuxuchaoshuai/p/18411730

相关文章

  • python 获取163 邮箱的邮件信息
    此案例是是获取的一个亚马逊的验证码importtimefromimaplibimportIMAP4_SSLimportimaplib,email,datetimefromlxmlimportetreefromdateutil.parserimportparsedefstr_to_unicode(s,encoding=None):returnstr(s,encoding)ifencodingelsestr(s)def......
  • uni-app vue3获取 小程序胶囊最新的方法
    1.第一步app.vue<scriptsetup> import{onLaunch}from'@dcloudio/uni-app'; onLaunch(()=>{ //获取胶囊按钮的位置 constbuttonPositon=uni.getStorageSync('buttonPositon') if(!buttonPositon){ constres=uni.getMenuButtonBoun......
  • 如何通过Python SDK 获取Collection
    本文介绍如何通过PythonSDK获取已创建的Collection对象。说明通过Collection对象,后续可进行Doc相关操作,如插入Doc、检索Doc、管理Partition等前提条件已创建Cluster:创建Cluster。已获得API-KEY:API-KEY管理。已安装最新版SDK:安装DashVectorSDK。接口定义Python......
  • 批量获取抖音直播间弹幕数据api:实时弹幕评论数据
    抖音作为当下最热门的短视频平台之一,拥有庞大的用户群体和活跃度,为电商行业带来了巨大的商业机会。抖音商品详情接口作为连接抖音平台和电商系统的关键纽带,具有重要的作用。本文将深入探讨抖音商品详情接口在电商行业中的重要性,并介绍如何通过代码实现实时数据获取,帮助电商企业更好......
  • jsp宠物店管理系统 本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文
    jsp宠物店管理系统本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能技术要求:   开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容......
  • 鸿蒙开发中获取定位信息
    使用LocationButton位置控件,首次点击应用中的位置控件,系统将弹窗请求用户授权,如果用户点取消,弹窗消失,应用无授权,用户再次点击位置控件时将会重新弹窗;用户点击允许,弹窗消失,应用将被授予临时位置权限,此后点击该应用的位置控件将不会弹窗。精准定位的临时授权会持续到灭屏、应用切......
  • pbootcms授权码怎么获取
    获取PbootCMS授权码的过程相对简单,以下是详细的步骤:1.上传源码将PbootCMS的源码上传到你的服务器,并通过域名访问你的网站。2.访问授权页面当你首次访问网站时,如果没有授权码,系统会提示你进行授权。3.获取授权码访问授权页面:根据提示,前往PbootCMS官方网站的授......
  • Spring事务失效的原因
    问题背景在业务实现当中,多线程并发操作会带来一些安全问题上的挑战。例如,在秒杀业务中,我们不仅要考虑多线程并发执行时对库存的考虑,还要考虑每个用户的请求是否由一个线程发出,当一个用户的请求由多个线程发出时,可能是脚本代刷的情况,这同样会导致业务出现异常。方法级别的......
  • 数据库———事务及bug的解决
    一:事务1:场景引入张三在银行账户中存有1000元,李四存有500元,这时张三要给李四支付500元,执行sql语句①:updateaccountsetbalance=balance-500wherename='张三';②:updateaccountsetbalance=balance+500wherename='李四';想象一下,如果在sql语句①执行完......
  • Pbootcms模板留言“提交成功”的提示语修改
    如果你想要修改PbootCMS模板中留言提交成功后的提示语,可以通过编辑相关控制器文件来实现。具体步骤如下:定位文件:找到 apps/home/controller/MessageController.php 文件。修改提示语:在该文件中找到处理留言提交成功的逻辑,并修改相应的提示语。具体步骤1.定位......