在 Spring 应用程序的事务中使用 Async

2023-11-21

我有一个 Spring 应用程序,它使用以下命令更新 MySQL DB 中的特定实体详细信息@Transactional方法,并且在同一方法中,我尝试使用调用另一个端点@Async这是另一个 Spring 应用程序,它从 MySql DB 读取相同的实体并更新 redis 存储中的值。

现在的问题是,每次我更新实体的某些值时,有时它会在 Redis 中更新,有时则不会。

当我尝试调试时,我发现有时第二个应用程序从 MySql 读取实体时会选择旧值而不是更新后的值。

谁能建议我可以采取什么措施来避免这种情况,并确保第二个应用程序始终从 Mysql 中选择该实体的更新值?


M. Deinum 的答案很好,但还有另一种方法可以实现此目的,这对于您的情况可能更简单,具体取决于您当前应用程序的状态。

您可以简单地将对异步方法的调用包装在一个事件中,该事件将在当前事务提交后进行处理,这样您每次都可以从数据库中正确读取更新的实体。

做到这一点非常简单,让我向您展示:

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

 @Transactional
public void doSomething() {

    // application code here

    // this code will still execute async - but only after the
    // outer transaction that surrounds this lambda is completed.
    executeAfterTransactionCommits(() -> theOtherServiceWithAsyncMethod.doIt());

    // more business logic here in the same transaction
}

private void executeAfterTransactionCommits(Runnable task) {
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
        public void afterCommit() {
            task.run();
        }
    });
}

基本上,这里发生的是,我们为当前事务回调提供一个实现,并且我们只重写 afterCommit 方法 - 还有其他方法可能有用,请检查它们。如果您想在其他部分使用此代码或只是使该方法更具可读性,为了避免键入相同的样板代码,我在辅助方法中提取了该代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring 应用程序的事务中使用 Async 的相关文章

随机推荐

  • 调用未定义函数convert_to_screen()

    我正在开发一个插件 我必须扩展 WP List Table 类 我已经在我的插件文件中扩展了该类 我不知道这是否是正确的方法 并包含 WP List Table 如下所示 if class exists WP List Table requ
  • 在heroku文件系统中写入文件并使用网络应用程序读取它

    我的应用程序中有一个工作进程每小时运行一个脚本 该脚本将数据写入文件系统 Web 应用程序使用该文件系统来更新其内容 我注意到 尽管工作人员成功运行了该进程 但数据并未更新 这是否与heroku的文件系统是只读的这一事实有关 如果是这样 我
  • Git 预接收钩子启动 PHP CodeSniffer [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想使用 PHP CodeSniffer 检查提交到我的远程 git 存储库的代码 如果代码标准存在任何问题 则拒绝它 有没有人有如何在 git 远程存储库上使用它的示例 或者示例如
  • Visual C++ 中的二进制再现性

    有没有办法在 Visual C 中强制相同的代码生成相同的二进制文件 换句话说 关闭 PE 中的时间戳或强制 PE 中的时间戳为某个固定值 它不仅仅是一个时间戳 还有一个用于 PDB 匹配的嵌入式 GUID 正如 John Robbins
  • Php 检查是否声明了静态类

    如何检查静态类是否已声明 前任 鉴于班级 class bob function yippie echo skippie 稍后在代码中我如何检查 if is a valid static object bob bob yippie 所以我不明
  • 如何关闭xampp中的通知报告?

    在远程服务器上没有问题 但在本地主机 xampp 3 1 中我无法关闭报告通知
  • 从另一个数据库访问用户定义的表类型

    我需要从另一个数据库访问用户定义的表类型 我使用了以下格式 DECLARE Hierarchy AS DatabaseName Schema Table 我收到以下错误 类型名称 DatabaseName Schema Table 包含的内
  • Karma 无法捕获 PhantomJS

    我们已经设置了一个 Jenkins CI 服务器 运行针对 PhantomJS 的 Karma 我们通过 Grunt 运行测试 Jenkins Grunt 和 Phantom 都运行正确 Karma 似乎启动良好 但 Karma 无法捕获
  • 是否可以减少 MongoDB 内存使用量?

    我正在使用 64 位 MongoDB 进行测试 如果我配置大尺寸备份 那么 MongoDB 内存利用率似乎很高 是否有可能减少 MongoDB 的内存利用率 MongoDB 使用 150 MB 内存是否理想
  • 在 Polly 库中使用 httpclient 的指数退避

    我刚刚读到波莉图书馆从桌面代理到服务器进行通信时 我需要处理 3 次重试 目前我喜欢指数退避 但是 我很难理解如何在我的代码中实现这一点 这是我到目前为止所做的 using HttpClient client new HttpClient
  • AutoFixture:模拟方法不返回冻结实例

    我正在尝试编写这个简单的测试 var fixture new Fixture Customize new AutoMoqCustomization var postProcessingAction fixture Freeze
  • C#:Dictionary 如何在没有 Add(KeyValuePair) 的情况下实现 ICollection> ?

    看着System Collections Generic Dictionary
  • CocoaPods 找不到 pod“GTMSessionFetcher/Core”的兼容版本

    我正在制作一个 React Native 移动应用程序 并希望合并 Firebase 和 Firebase 身份验证 但是 当我运行 pod install 或 pod update 时 我遇到此错误 我做了一些研究 发现这个问题还没有被谷
  • Cocos2d-x android无法解析cocos2dx库

    我从 macOS xcode 4 5 开始 我尝试过教程 使用cocos2dx完成macOSX的构建 问题发生在android源中 没有描述cocos2dxActivity的内容 所以 org cocos2dx lib不是其他文件 安卓没有
  • 扩展高度以包含绝对定位的儿童

    我正在为 CMS 构建 html javascript 主题设计器 元素是绝对定位的 可以通过鼠标移动 调整大小 和 或包含可编辑文本 其高度可以由行数确定 然而 我遇到了一个问题 即父元素的高度不会扩展以包含其绝对定位的子元素 最少的代码
  • 更改摩卡的默认超时

    如果我们有一个单元测试文件 my spec js 并使用 mocha 运行 mocha my spec js 默认超时为 2000 毫秒 可以使用命令行参数覆盖它以进行部分测试 mocha my spec js timeout 5000 是
  • 如何使用 Azure Blob 存储 SDK 将 Blob 从一个容器复制到另一个容器

    我一直在参考文档https learn microsoft com en us azure storage blobs storage quickstart blobs python 我无法找到将文件从一个容器复制 移动到另一个容器的正确
  • Swift 进度指示器图像蒙版

    首先 该项目是使用 Swift 构建的 我想创建一个自定义进度指示器 在脚本运行时 填满 该脚本将调用从远程服务器拉取的 JSON 提要 为了更好地形象化我所追求的 我做了这个 我的猜测是有两个 PNG 图像 一白一红 然后根据进度量简单地
  • 计算值用 R 改变符号的次数

    我对 R 还很陌生 但我对它很感兴趣 因为我发现它很容易使用 尽管我不是程序员 我试图解决以下问题 我需要计算列中值更改符号的次数 然后按路径对结果进行排序 下面是表格的示例 路径是一个因素 一旦我最终得到数据 我就可以计算出如何对数据进行
  • 在 Spring 应用程序的事务中使用 Async

    我有一个 Spring 应用程序 它使用以下命令更新 MySQL DB 中的特定实体详细信息 Transactional方法 并且在同一方法中 我尝试使用调用另一个端点 Async这是另一个 Spring 应用程序 它从 MySql DB