对于特定要求,我将不得不遍历50000条记录的列表并将它们插入到数据库中。要求是,如果50000条记录中的任何一条记录失败,则所有其他记录都应该回滚。因此我们没有涉及处理中的任何提交。但是这导致了以下错误:
[2/1/16 14:01:47:939 CST] 000000be SystemOut O ERROR org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback;未分类SQL的SQLException [INSERT INTO ...)VALUES(...)]; SQL状态[null];错误代码[0];当前 线程在超过[120]秒内未提交并可能发生 不必要的阻塞锁。请重构代码以提交更多内容 频繁。
现在,当我们实现批处理时 - 我们使用PreparedStatement.executeBatch()方法以100个批量插入数据,上述错误不会出现。对于批处理,autoCommit默认设置为true,因此每次批处理后都会发生提交。
在上述情况下,有人可以建议我们如何处理回滚机制。如果第50批次执行失败,那么我们希望还原所有之前的49个批处理执行。我们使用的是Spring Data / JDBC,Oracle 11g数据库,WebSphere应用服务器。我已经在某处读过,也可以在WebSphere的JTA设置中配置上面120秒的提交超时。是这样吗?请提出任何替代方案或其他可能的解决方案。
提前谢谢。
答案 0 :(得分:0)
您必须将autocommit设置为false,并且只有在所有批次成功执行后才提交。