【发布时间】:2021-04-01 17:05:33
【问题描述】:
有没有办法在春季批处理作业上重新定义数据库“事务”边界?
上下文:
我们有一个简单的支付处理作业,它读取 x 条支付记录,处理并将数据库中的记录标记为已处理。目前,作者执行 REST API 调用(到支付网关),处理 API 响应并将记录标记为已处理。我们正在采用面向块的方法,因此在整个块完成之前,更新不会刷新到数据库中。因为,基本上整个读/写都在一个事务中,我们开始看到过多的数据库锁和争用。例如,如果 API 需要很长时间来响应(比如 30 秒),整个应用程序就会开始受到影响。
我们显然可以将 API 调用的超时时间减少到一个更小的值。但这仍然不能解决表可能被锁定的时间超过预期持续时间的问题。理想情况下,我们希望使数据库事务尽可能短。我们的想法是,如果这项工作的“内容”可以在数据库事务之外完成,我们就可以绕过这个问题。因此,如果 API 调用发生在数据库事务之外……我们可以承受它多花几秒钟的时间来接受响应,而不是导致/增加长锁定持续时间。
这是正确的方法吗?如果不是,以春季批处理方式处理这项“简单”工作的推荐方法是什么?还有其他更适合该任务的批处理工具吗? (如果 spring-batch 不是正确的选择)。
如果需要,可以提供更多上下文。
【问题讨论】:
标签: performance transactions spring-batch