【问题标题】:@OnWriteError method not updating the DB record status@OnWriteError 方法不更新数据库记录状态
【发布时间】:2020-07-17 11:49:37
【问题描述】:

我有一个 itemWriter 将项目写入表。编写时,我得到一个 ConstraintViolationException 并且我正在使用 SkipPolicy 跳过该异常,并且我已经实现了 @OnWriteError 方法。因此它可以很好地捕获和跳过异常并在侦听器中调用 @OnWriteError 方法。在@OnWriteError 方法中,当捕获到异常时,我正在调用另一个方法来将事件标记为失败。

@OnWriteError

public void onWriteError(Exception exception,List item) {

    log.info("WRITE ERROR LISTENER CALLED");

    学生    学生 = items.get(items.size()-1);

    studnetManager.updateStatuss(student, "FAILED);

}

public void updateStatuss(Student student, Status status) {

        Student.setStatus(status);

        StudentRepository.save(Student);

}

updateStatuss() 成功调用,但学生记录未标记为 FAILED。 谁能帮我理解这个?

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    如 Javadoc 中所述,ItemWriteListener#onWriteError 将在将要回滚的事务中调用。

    因此,您需要在单独的事务中调用该代码(使用 @Transactional(propagation = "REQUIRES_NEW") 注释 updateStatus 或使用 TransactionTemplate 以编程方式调用事务代码)。

    【讨论】:

    • 感谢@Mahmoud Ben Hassine。这真的解决了我的问题。但是使用 @Transactional(propagation = "REQUIRES_NEW") 对性能有何影响?
    • 在这种情况下,请接受答案:stackoverflow.com/help/someone-answers。这应该不会影响性能,除非您有大量记录并且扫描了大量数据块(这意味着项目在单独的事务中一个一个地重试)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2021-07-17
    • 2021-04-06
    • 2019-05-03
    • 2018-06-08
    相关资源
    最近更新 更多