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 для получения дополнительной информации о распространении транзакции.

Другие вопросы по тегам