Java spring批处理在作业存储库和实际任务之间使用不同的事务管理器

Java spring批处理在作业存储库和实际任务之间使用不同的事务管理器,java,spring,spring-batch,Java,Spring,Spring Batch,我使用SpringBatch使用2个(可能更多,为简单起见假设为2个)数据库。 一个用于存储所有作业数据(所有批处理表)。另一个用于实际运行我的业务逻辑数据。 有些事情我不太明白 当我声明我的JobRepository时,我已经指定了我的TransactionManager,为什么我必须在我的tasklet上再次这样做?(我不是故意使用默认名称) 我目前正在为tasklet提供与我的JobRepository相同的TrasactionManager,它管理与我在步骤中所做的不同的连接。这是否意味

我使用SpringBatch使用2个(可能更多,为简单起见假设为2个)数据库。 一个用于存储所有作业数据(所有批处理表)。另一个用于实际运行我的业务逻辑数据。 有些事情我不太明白

  • 当我声明我的JobRepository时,我已经指定了我的TransactionManager,为什么我必须在我的tasklet上再次这样做?(我不是故意使用默认名称)
  • 我目前正在为tasklet提供与我的JobRepository相同的TrasactionManager,它管理与我在步骤中所做的不同的连接。这是否意味着我必须在我的作者或读者中进行自己的事务管理
  • 如果#2为真,那么中的“如果”将是我的问题(不做XA),对吗?因为我的数据和工作数据有不同的联系,对吗

  • 您可以为任务和作业存储库使用单独的事务管理器。请看这里:

    因此,需要指定其中两个


    尽管如此,即使您可以使用两个独立的事务管理器,但这并不意味着您应该这样做。如果不使用XA,那么想象一下,如果业务流程成功运行,但作业数据没有保存,会发生什么情况。下次运行批处理时,Spring batch会认为作业失败,并尝试再次运行它。

    这正是我担心的。所以,当不使用XA时,最好将批处理表和数据表放在同一个数据库中,对吗?或者确保每一步都可以安全地重新运行?另一件事是tasklet上的transactionmanager在我的步骤逻辑中用于jdbc调用还是保存作业状态?或者两者都有?正确,手册建议您将批处理表放在与业务数据相同的位置,尽管我认为您也可以使步骤安全地重复。事务管理器可以在tasklet级别、作业级别或两者都指定,具体取决于您希望如何设置它。它们不必是一样的。