Spring JDBC:120秒后出现Oracle事务错误

问题描述:

对于特定的需求,我将不得不遍历50000条记录列表并将它们插入到数据库中。要求是如果50000条记录中的任何一条失败,所有其他记录应该回滚。因此我们没有涉及任何处理。但是,这导致了以下错误:Spring JDBC:120秒后出现Oracle事务错误

[2/1/16 14:01:47:939 CST] 000000be SystemOut O ERROR org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [INSERT INTO ...) VALUES (...)]; SQL state [null]; error code [0]; Current thread has not commited in more than [120] seconds and may incur unwanted blocking locks. Please refactor code to commit more frequently.

现在,当我们实现了配料 - 我们使用了PreparedStatement.executeBatch()方法插入在100批次的数据,上述错误不会出现。对于批处理,默认情况下autoCommit设置为true,因此每次批处理执行后都会发生提交。

任何人都可以建议我们如何处理上述情况下的回滚机制。如果第50批次执行失败,那么我们希望恢复所有先前的49批次执行。我们正在使用Spring Data/JDBC,Oracle 11g数据库,WebSphere应用服务器。我已经读过某处,可以在WebSphere的JTA设置中配置120秒以上的提交超时。是这样吗?请提出任何替代或其他可能的解决方案

预先感谢您。

您必须将autocommit设置为false,并且只有在所有批次都成功执行时才提交。