我想我在尝试使用@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连接池。
谢谢