gpt4 book ai didi

java - 使用 Spring 和 Hibernate 长时间运行事务?

转载 作者:可可西里 更新时间:2023-11-01 07:03:58 25 4
gpt4 key购买 nike

我要解决的根本问题是运行一个在 MySQL 中生成多个临时表的任务,这些临时表需要保留足够长的时间才能在创建后从 Java 中获取结果。由于涉及的数据量大,任务必须分批完成。每个批处理都是对通过 JDBC 调用的存储过程的调用。对于大型数据集,整个过程可能需要半小时或更长时间。

为了确保对临时表的访问,我在一个带有 TransactionCallbackWithoutResult 的 Spring 事务中运行整个任务,从头到尾。否则,我可能会得到一个无法访问临时表的不同连接(在我将所有内容包装在事务中之前偶尔会发生这种情况)。

这在我的开发环境中运行良好。但是,在生产中我遇到了以下异常:

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

当另一个任务在我的长时间运行的事务执行期间试图访问一些相同的表时,就会发生这种情况。令我困惑的是,长时间运行的事务只插入或更新到临时表中。对非临时表的所有访问都只是选择。从我能找到的文档来看,在这种情况下,默认的 Spring 事务隔离级别不应导致 MySQL 阻塞。

那么我的第一个问题是,这是正确的方法吗?我能否确保在没有长时间运行的事务的情况下通过 Hibernate 模板重复获得相同的连接?

如果长时间运行的事务方法是正确的,那么我应该检查隔离级别方面的哪些内容?我的理解是否正确,即 Spring/MySQL 事务中的默认隔离级别不应锁定仅通过选择访问的表?我该如何调试导致冲突的表,并防止这些表被事务锁定?

最佳答案

我认为长时间保持交易开放是邪恶的。在我的职业生涯中,“扩展”的定义已经从秒下降到毫秒。

它是不可重复问题和令人头疼的问题的源泉。

在这种情况下,我会硬着头皮在软件中保留一个“工作日志”,如果批处理失败,您可以反向重播以清理。

关于java - 使用 Spring 和 Hibernate 长时间运行事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2958337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com