Я работаю над проектом, в котором я хочу использовать очень специфическую стратегию распространения транзакций.База данных имеет два набора таблиц: активную и архивную.Каждый набор таблиц реализован со своими сущностями и интерфейсами, которые расширяют 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
методам в контексте приложения или только для отдельных объектов?