我正在处理一个项目,我想使用一个非常具体的事务传播策略。数据库有两组表,活动表和存档表。每一组表都是用自己的扩展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
方法,还是仅适用于每个实体?
1条答案
按热度按时间qf9go6mv1#
将保存调用 Package 到一个新方法中,并使用@transmart.tag_1注解该方法
默认情况下(PROPAGATION_REQUIRED),它将执行内部事务到同一个事务中。请参见https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/images/tx_prop_required.png