如何将 Spring 事务传播到另一个线程?

dma*_*a_k 5 java spring multithreading transactions propagation

也许,我做错了什么,但我找不到以下情况的好方法。

我想对一个在下面使用Spring Batch来执行作业的服务进行单元测试。作业通过AsyncTaskExecutor在单独的线程中预先配置来执行。在我的单元测试中,我想:

  1. 创建少量域对象并通过 DAO 持久化它们
  2. 调用服务方法来启动作业
  3. 等待作业完成
  4. 使用 DAO 检索域对象并检查它们的状态

显然,以上所有内容都应该在一个事务中执行,但不幸的是,事务不会传播到新线程(我理解这背后的基本原理)。

我想到的想法:

  • 在步骤 (1) 之后提交事务 #1。不好,因为数据库状态应该在单元测试后回滚。
  • Isolation.READ_UNCOMMITTED在作业配置中使用。但这需要两种不同的配置用于测试和生产。

gka*_*mal 2

我认为最简单的解决方案是在测试执行期间使用 SyncTaskExecutor 配置 JobLauncher - 这样作业就在与测试相同的线程中执行并共享事务。

任务执行器配置可以移动到单独的 spring 配置 xml 文件中。它有两个版本 - 一个是在测试期间使用的 SyncTaskExecutor,另一个是用于生产运行的 AsyncTaskExecutor。