【问题标题】:Change Spring Batch Control Table Locking Strategy更改 Spring Batch 控制表锁定策略
【发布时间】:2020-02-05 23:34:14
【问题描述】:

我们有一个系统,允许操作员通过使用 JobExplorer 获取对 JobExecution 的引用并在其上调用 stop() 来停止长时间运行的 Spring Batch 作业。然后,我们的作业中有代码使用JobExplorer 获取JobExecution 的最新副本,以检查它是否已被标记为停止。

我们的问题是 Microsoft SQL Server 2016 中元数据表的死锁。每个选择都在执行共享页面锁定。我所能找到的关于更改锁定级别的所有内容都涉及在SELECT 语句上使用提示。但是 Spring Batch 正在创建语句,而不是我们的代码。

有没有办法告诉 Spring Batch 在制作SELECT 语句时使用只读并发?如果没有,是否有一些机制没有编写我们自己的JobExplorer 来完成这个?

【问题讨论】:

    标签: sql-server spring-batch database-deadlocks


    【解决方案1】:

    通过使用 JobExplorer 获取对 JobExecution 的引用并在其上调用 stop() 来停止长时间运行的 Spring Batch 作业。

    JobExecution#stop 将在下一个次要版本 4.3 中弃用,并在下一个主要版本中删除(请参阅https://github.com/spring-projects/spring-batch/issues/1605)。停止作业执行的正确方法是使用JobOperator#stop

    有没有办法告诉 Spring Batch 在进行 SELECT 语句时使用只读并发?如果没有,是否有一些机制没有编写我们自己的 JobExplorer 来完成这个?

    有一个未解决的问题可以使作业资源管理器成为事务性(只读):https://github.com/spring-projects/spring-batch/issues/1307。同时,您可以使SimpleJobExplorer 事务性(通过AOP 或通过扩展它以在方法上添加@Transactional(readOnly = true))。

    【讨论】:

    • 我一定不明白您所说的“扩展 SimpleJobExplorer 以添加 @Transactional(readOnly=true)”是什么意思。我将它子类化并在我的 DefaultBatchConfigurer 子类中创建它。这一切似乎都正常工作,并且正在调用我的带有注释的覆盖方法,但他们所做的只是调用它们的超级等价物。没有喜悦。我的 JobRepository 已经有 ISOLATION_READ_UNCOMMITTED,所以我没有可以实施的想法。是否需要我的 MSSQL 数据库具有 ALLOW_SNAPSHOT_ISOLATION ON 和 READ_COMMITTED_SNAPSHOT ON 才能使其正常工作?
    • 是的,这就是我的意思,用事务建议装饰 SimpleJobExplorer 方法。也就是说,我看不到与作业存储库的隔离级别的关系。 JobRepository 和 JobExplorer 可以配置不同,每个都有自己的事务属性。
    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 2023-04-01
    • 2023-03-25
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多