每个要保存元素的春季交易

时间:2018-12-30 13:13:35

标签: java spring-boot spring-data spring-transactions transactional

我正在与我的应用程序实现excel集成。现在,代码如下:

@Autowired
private FooRepository fooRepository;

@Autowired
private AuxRepository auxRepository;

public void doImport(...) {

    List<ExcelDto> excelRows = // read the excel file to get all the rows

    for (ExcelDto row in excelRows) {
        try {
            // Build the Foo object to persist
            Foo foo = new Foo();
            foo.setProp1(row.prop1);

            // This is just to show that I access the database in order 
            // to retrieve information needed by the Foo object
            String aux = auxRepository.findOneById(row.auxId);
            foo.setAux(aux);

            //Build the rest of Foo...

            // Try to save it (it still may fail due to database constraints)
            fooRepository.save(foo);
        } catch (Exception e) {
            // log error
        }
    }
} 

excel集成具有以下必要条件:

  • 如果某个项目无法保留,则应记录该错误,但以下项目应保留

现在发生的事情是,如果某个项目失败,则事务将回滚,并且由于某些原因,持久化的项目将保持持久状态,但是在下一个.save()上,我开始遇到{{1} }。我没有在任何地方使用任何transaction rolled back批注,而是使用@Transactionalspring-boot,因此默认情况下启用了事务处理(如here所述)。

由于我没有Spring经验,所以我想知道什么是达到此要求的最佳方法。我是否应该将spring-data方法与另一个带有.save()的方法放置在一起,例如:

Transaction.REQUIRES_NEW

如果是这样,如果我的@Transactional(propagation = Propagation.REQUIRES_NEW) public save(Foo foo) { fooRepository.save(foo); } 在其他方法上失败了怎么办?我是否应该将用于构建和保存auxRepository.findOneById()的整个逻辑放在一个单独的方法中?这对性能有何影响?

非常感谢您的帮助/指导。

谢谢

0 个答案:

没有答案