Обеспечивает ли Spring @Transactional, помеченный методом, сброс данных именно тогда, когда метод заканчивается? - PullRequest
0 голосов
/ 02 октября 2019

У меня есть этот упрощенный сценарий в приложении Spring с Java и Hibernate для поставщика сохраняемости:

@Transactional
void method1() { // some savings}

@Transactional
void method2() { // some savings}

Когда я запускаю родительский метод (не аннотированный как транзакционный)

void parentMethod() {
    method1();
    method2();
}

Могу ли я убедиться, что, когда метод завершит работу, изменения будут внесены в базу данных непосредственно перед вызовом метода? Или что изменения могут быть сброшены в базу данных позже, с некоторой задержкой?

Меня интересуют другие приложения, видящие изменения, внесенные в базу данных сразу после завершения метода1 (и до вызова метода2)

Обновление Мой родительский метод не определен втот же класс, и класс и фирма моего родительского метода не имеют аннотации @Transactional

Спасибо!

1 Ответ

1 голос
/ 02 октября 2019

К вашему вопросу ... обеспечить сброс данных именно тогда, когда метод завершится ? Нет, не точно , когда метод заканчивается, но последний , когда метод заканчивается.

В транзакции вы можете сбросить текущее состояние столько раз, сколько пожелаете. Промывка означает, что вы синхронизируете сеанс JPA с базой данных. См. Hibernate doc относительно этого. Промывка не означает, что ваши изменения долговечны;если транзакция откатывается позже, эти изменения будут автоматически отменены. Операция commit выполняет разные шаги, один из которых - обеспечить синхронизацию сеанса JPA (например, Hibernate) с БД и при необходимости вызвать сброс. Если сеанс уже синхронизирован, сброс будет пропущен.

В комментариях вы написали, что класс и метод parentMethod не являются транзакционными и что method1() и method2() определены в отдельном классе. ,В том случае, когда вызывается method1(), начинается новая транзакция. Когда этот метод заканчивается, эта транзакция будет зафиксирована. Любые изменения в базе данных, сделанные этим методом, будут длительными , т.е. независимо от того, что произойдет позже (исключения, откат в других методах), эти изменения останутся в базе данных.

Некоторыеинформацию, относящуюся к вашему делу, можно найти здесь , потому что важно следующее:

  1. Если эти методы относятся к одному и тому же классу и
  2. Если вы используете Springсобственный AOP или AspectJ. Кроме того, это зависит от класса, в котором определен ваш parentMethod. Если это транзакция, то эти 2 вызова будут выполняться в рамках существующей транзакции, и после принятия 1-го транзакция не будет зафиксирована.
...