【发布时间】:2011-02-26 20:25:27
【问题描述】:
我要解决的根本问题是在 MySQL 中运行一个生成多个临时表的任务,这些临时表需要保持足够长的时间才能在创建后从 Java 中获取结果。由于涉及的数据量大,任务必须分批完成。每个批处理都是对通过 JDBC 调用的存储过程的调用。对于大型数据集,整个过程可能需要半小时或更长时间。
为了确保访问临时表,我在一个带有 TransactionCallbackWithoutResult 的 Spring 事务中运行整个任务,从头到尾。否则,我可能会获得一个无法访问临时表的不同连接(在我将所有内容包装到事务中之前偶尔会发生这种情况)。
这在我的开发环境中运行良好。但是,在生产中我遇到了以下异常:
java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
当我的长时间运行的事务执行期间另一个任务试图访问一些相同的表时,就会发生这种情况。让我感到困惑的是,长时间运行的事务只插入或更新到临时表中。对非临时表的所有访问都只是选择。从我能找到的文档中,默认的 Spring 事务隔离级别不应该导致 MySQL 在这种情况下阻塞。
所以我的第一个问题是,这是正确的方法吗?我能否确保通过 Hibernate 模板反复获得相同的连接而无需长时间运行事务?
如果长期运行的事务方法是正确的,我应该在隔离级别方面检查什么?我的理解是否正确,Spring/MySQL 事务中的默认隔离级别不应锁定仅通过选择访问的表?如何调试导致冲突的表,并防止这些表被事务锁定?
【问题讨论】:
标签: java mysql hibernate spring transactions