尝试使用错误的版本(2)更新步骤执行id = 1,其中当前版本为1

时间:2013-07-16 15:32:26

标签: spring-batch spring-transactions

我使用SpringBatch 2.1.7发行版核心和Infrastructure jar来读取CSV文件并将其保存到数据库。

将我的代码与Spring石英调度程序集成以运行每分钟,批处理工作正常,读取和写入但它失败并出现错误“org.springframework.dao.OptimisticLockingFailureException:尝试更新步骤执行id = 1 with wrong version(2),其中当前版本为1“

由于Tx冲突。请建议我如何解决这个问题。

3 个答案:

答案 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)