强制不同的Spring存储库使用同一事务

时间:2018-10-02 16:26:08

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

我正在一个项目中,我想使用非常特定的事务传播策略。该数据库有两组表,活动表和归档表。每组表都使用其自己的扩展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的默认事务传播在同一物理事务中执行不同的Transactional方法-是在应用程序上下文中适用于所有Transactional方法,还是仅基于每个实体?

1 个答案:

答案 0 :(得分:2)

将保存调用包装到新方法中,并使用@Transactional注释该方法

df.select($"a.b.c" as "c").cache().count()

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