【发布时间】:2018-10-02 16:26:08
【问题描述】:
我正在做一个项目,我想使用一个非常具体的事务传播策略。该数据库有两组表,活动表和存档表。每组表都使用自己的扩展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 方法,还是仅适用于每个实体?
【问题讨论】:
-
即使它们有不同的表结构,考虑
before update trigger(假设数据库支持它)。当多种类型的客户端可以更新时,这可以简化客户端并降低复杂性。
标签: java spring spring-boot spring-data-jpa