Spring транзакции: метод с require_new вызывается из метода с require
Я хотел бы понять, когда именно происходит коммит и когда происходит откат в случае вложенной транзакции с разными уровнями изоляции для вызывающих и вызываемых методов,
Например, у меня есть две весенние службы, и я вызываю method2 из service2 из method1 of service1.
У Method1 есть требуемая область транзакции, а у Method2 есть область транзакции REQUIRES_NEW, как показано в программе ниже.
Service1 {
@Transactional(propagation = Propagation.REQUIRED)
method1()
{
for(int i=0; i<10; i++){
service2.method2();
}
// Some more code which takes some time to process
}
}
Service2 {
@Transactional(propagation = Propagation.REQUIRES_NEW)
method2()
{
//Save some information to DB
// Save an object using JPA
}
}
Теперь мой вопрос: насколько я понимаю, REQUIRES_NEW запустит новую транзакцию, но выполнит ли она немедленную фиксацию в существующем method2 или весна будет ждать завершения метода method1, а затем фиксирует?
Меня интересует, в какой момент происходит фиксация и блокировка строки в БД, которая сохраняется в method2.
Примечание. Здесь я разместил оба метода в разных сервисах, чтобы Spring могла выполнять вложенные транзакции.
Заранее спасибо,
Вели
1 ответ
Когда вы вводите метод2 службы2, транзакция службы1 (скажем, tx1) приостанавливается и создается новая транзакция для службы2 (например, tx2). эта новая транзакция не зависит от предыдущей транзакции и будет независимо от фиксации или отката.
tx2 выполнит фиксацию / откат только тогда, когда вы вернетесь из service2, и после этого tx1 возобновит работу с того момента, на котором был приостановлен. результат tx2 (фиксация или откат) не повлияет на поведение tx1.
пожалуйста, прочитайте весеннюю документацию здесь. Проверьте раздел 16.5.7 для получения дополнительной информации о распространении транзакции.