Принуждение разных репозиториев Spring использовать одну и ту же транзакцию - PullRequest
0 голосов
/ 02 октября 2018

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

обернуть вызовы сохранения в новый метод и аннотировать метод с помощью @ Transactional

@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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...