我使用SpringBatch 2.1.7发行版核心和Infrastructure jar来读取CSV文件并将其保存到数据库。
将我的代码与Spring石英调度程序集成以运行每分钟,批处理工作正常,读取和写入但它失败并出现错误“org.springframework.dao.OptimisticLockingFailureException:尝试更新步骤执行id = 1 with wrong version(2),其中当前版本为1“
由于Tx冲突。请建议我如何解决这个问题。
答案 0 :(得分:6)
我有同样的例外。
org.springframework.dao.OptimisticLockingFailureException:
Attempt to update step execution id=0 with wrong version (2), where current version is 3
在我的情况下,它是由于吞下的过程步骤失败引起的。 Spring Batch激活了编写器,即使处理器发生故障。查看您的日志以确保您的流程步骤正在完成并返回一些内容。
答案 1 :(得分:1)
正如MattC所指出的那样,当我的ItemProcessor
被窃听时,我遇到了这个错误。出于某种原因,在我的处理器活动期间,它正在关闭与jobrepository
的数据源连接,所以我的例外是:
Encountered an error saving batch meta data for step step1 in job myjob. This job is now in an unknown state and should not be restarted.
org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=1 with wrong version (1), where current version is 2
在堆栈跟踪结束时,我找到了:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection is closed.
为了确定问题,首先我将相位隔离开来。我构建了NoOpProcessor和NoOpItemWriter。调整了tasklet并且运行良好。所以我的问题不在于读者。
然后我回滚到我的"完整" ItemWriter实现,再次,它运作良好。所以我的问题不在于作家。当我启用我的"完整"处理器,错误再次发生。所以,错误在其中,我开始调试。
所以,不幸的是,我的答案是:debug ...
public class NoOpProcessor implements ItemProcessor<Object, Object> {
@Override
public Object process(Object arg0) throws Exception {
System.out.println("Input object: " + Objects.toString(arg0));
return arg0;
}
}
public class NoOpItemWriter implements ItemWriter<Object> {
@Override
public void write(List<? extends Object> items) throws Exception {
if (items != null) {
System.out.println("Qtty of items to be written: " + items.size());
for (Object obj : items) {
System.out.println(Objects.toString(obj));
}
} else {
System.out.println("The items list is null. Nothing to be written.");
}
}
}
答案 2 :(得分:0)
使用Hibernate并更新到版本> 5时也会发生这种情况。问题是序列生成的默认设置已更改。但是,如果您仍然使用遗留序列,那么一切都会变得混乱。此问题的指示是在发生实际异常之前之前的错误和警告日志。它们是这样的:SQL Error: 1, SQLState: 23000
和ORA-00001: Unique Constraint (..) violation
。
表中有负主键(为每个项目设置提交)。
要解决此问题,请在persistence.xml中将属性hibernate.id.new_generator_mappings
设置为false
。
链接:
在寻找解决方案时,我偶然发现了另一个可能导致此问题的问题:将MapJobRepositoryFactoryBean
与ResourcelessTransactionManager
一起使用时,重复的条目将持续存在(这并不是假定要保留数据。)。
链接:http://ashamathavan.blogspot.com/2010/12/optimisticlockingfailureexception.html