Spring Data Jpa 强制不同的Spring Repository使用相同的事务

xoshrz7s  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(152)

我正在处理一个项目,我想使用一个非常具体的事务传播策略。数据库有两组表,活动表和存档表。每一组表都是用自己的扩展CrudRepository<T, ID>的实体和接口实现的。目标是在单个事务中将一组实体插入到活动表中,并将活动表中的所有数据插入到归档表中。表中的实体不相同,并且将具有不同的表结构。
给定两个独立的存储库,类似于

public interface FooRepository extends CrudRepository<Foo, Integer>
public interface FooArchiveRepository extends CrudRepository<FooArchive, Integer>

以及类似于

@Autowired FooRepository fooRepo;
@Autowired FooArchiveRepository fooArchiveRepo;
@Autowired BarService barService;
List<Foo> newData = barService.doThing();
fooRepo.saveAll(newData);
// fooData is a list of FooArchive from earlier
fooArchiveRepo.saveAll(fooData);

目标是保证fooRepo.saveAll(newData)fooArchiveRepo.saveAll(fooData)在单个数据库事务中执行。Spring默认的Required transaction propagation在同一个物理transaction中执行不同的Transactional方法-这是否适用于Application Context中的所有Transactional方法,还是仅适用于每个实体?

qf9go6mv

qf9go6mv1#

将保存调用 Package 到一个新方法中,并使用@transmart.tag_1注解该方法

@Transactional
public void saveAll(){
  fooRepo.saveAll(newData);
  // fooData is a list of FooArchive from earlier
  fooArchiveRepo.saveAll(fooData);
}

默认情况下(PROPAGATION_REQUIRED),它将执行内部事务到同一个事务中。请参见https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/images/tx_prop_required.png

相关问题