使用Spring Data JPA并发持久存储对象的正确方法是什么?

时间:2018-11-02 15:19:00

标签: java spring spring-data-jpa spring-transactions

我想我在尝试使用@Async注释同时持久存储对象时可能会注意到死锁的情况。

我使用了类似

的组件
@Component
public class AsyncInserter{
    @Autowired
    private PersonRepository repository;

    @Async
    @Transactional
    public CompletableFuture<Boolean> insert(List<Person> persons){

          repository.saveAll(persons);
          repository.flush();
          return CompletableFuture.completedFuture(Boolean.TRUE);
    }

我从定义为       @零件       公共类PersonServiceImpl {

      @Autowired
      private AsyncInserter asyncInserter;

      @Transactional
      public void performDBOperation(List<Person> persons){

           deletePersons(/** some criteria */);
            List<List<Person>> subPersonList = Lists.partition(persons, 100);
            subPersonList.forEach(list->{ statuses.add(asyncInserter.insert(list));});

      }

您注意到,我有一个delete和Insert(在并发中),我想完全成为原子。

但是我注意到是删除操作,并且提交了许多插入内容,但从未提交过。

我认为,有一些锁在阻止,在并发线程中运行时,我可以隔离此锁。对于https://dzone.com/articles/spring-and-threads-transactions,似乎在创建新线程时,外部事务不会传播到新创建的线程,而是创建新事务。

这种设计似乎有缺陷。在提交插入内容之前,我需要先提交delete吗?但是,如果其中一个插入失败,如何实现原子操作

我修改了代码,以便在单个线程中同时运行删除和插入操作,并且它可以正常工作,无论如何这都是预期的。但是我注意到在插入记录之后,提交需要更长的时间。通常,需要12秒才能提交1万条记录。哪些是巨大的开销?有什么办法可以改善这一点?

顺便说一句,我正在使用Hikari连接池。

谢谢

0 个答案:

没有答案