Spring транзакции внутренности - PullRequest
6 голосов
/ 23 декабря 2011

Ситуация следующая:

  1. В Method1 есть четыре метода обновления базы данных.Method1 аннотируется с использованием семантики управления транзакциями Spring.

  2. В Method2 есть метод чтения базы данных, и он вызывается после того, как Method1 завершит выполнение всех своих обновлений базы данных.Метод 2 также аннотируется с использованием семантики транзакции Spring.

  3. Приходит веб-запрос, контроллер перехватывает запрос и вызывает method1, а затем method2.

  4. Транзакция также оборачивается вокруг веб-запроса.

Мне интересно знать следующее:

1. Как Spring знает о совершениибаза данных обновляется после успешной транзакции?Есть ли какая-то ссылка на реализацию Spring, которая выполняет управление транзакциями?

2. Поскольку у нас есть иерархия транзакций: транзакция вокруг веб-запроса-> транзакция с распространением = RequestNew для метода1-> транзакция с распространением= Требуется для Method2, как Spring выполняет управление транзакциями, чтобы гарантировать, что транзакции выполняются в правильном контексте с правильным порядком?

Короче, было бы здорово получить учетную запись play by play о том, как Springвыполняет управление транзакциями во всех своих мельчайших деталях или ссылку на документацию, которая не просто передает вручную объяснение, касающееся JTA или какой-либо другой аббревиатуры.

Спасибо

Ответы [ 3 ]

9 голосов
/ 23 декабря 2011

Позволяет сделать несколько основных утверждений.

  1. Транзакционный контекст - это среда, в которой некоторые специальные свойства (сеанс базы данных) становятся доступными для среды выполнения приложения, которые в противном случае недоступны.Контекст транзакции обычно используется для определения объема транзакции.
  2. Spring использует AOP Proxies и метаданные XML для достижения декларативного управления транзакциями.
  3. Аннотации используются для обозначения поведения распространения транзакции определенного метода.
  4. Spring использует Механизм перехватчика для применения транзакции к методам.

Здесь я снова использую пример, приведенный @stacker выше

MyClass{

    @Transactional
    public void sequence() {
      method1();
      method2();
    }

    @Transactional
    void method1() {
    }

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    void method2() {
    }

}

Вы также можете достичь той же функциональности, используя конфигурацию xml.Давайте возьмем это как популярное и широко используемое.

Во время развертывания

  • Spring Framework проверяет файлы конфигурации xml (известные applicationContext.xml) и, в зависимости от конфигурации, сканируеткод для аннотации @Transactional (при условии, что конфигурация упоминается как основанная на аннотации).
  • После этого он создает AOP-прокси для методов, помеченных для транзакции.Проще говоря, эти прокси являются не более чем оболочкой для соответствующих методов.
  • Внутри этих методов-оболочек до и после кода Transaction Advisor также генерируется в зависимости от конфигурации (а именно транзакциираспространение).
  • Теперь, когда эти методы-обертки вызываются, Transaction Advisor появляется до и после фактического вызова метода.,
  • Представляет то же самое в псевдокоде для примера выше

      ProxyMyClass{   
        MyClass myclass;
        .
        .
        .
        sequence(){
         //Transaction Advisor code (Typically begin/check for transaction)
         myclass.sequence();
         //Transaction Advisor code(Typically rollback/commit)
        }
        .
        .
        .
        }
    

Вот так Spring управляет транзакцией.Небольшое упрощение, хотя.

Теперь, чтобы ответить на ваши вопросы,

. Откуда Spring знает, как фиксировать обновления базы данных при успешной транзакции?Есть ли какая-то ссылка на реализацию Spring, которая выполняет управление транзакциями?

Каждый раз, когда вы вызываете метод в транзакции, вы фактически вызываете прокси-сервер, который сначала выполняет советник по транзакциям (который начнет транзакцию),затем вы вызываете фактический бизнес-метод, после завершения которого выполняется другой советник по транзакциям (который в зависимости от возвращенного метода выполнит фиксацию или откат транзакции).

Поскольку у нас есть иерархия транзакций: транзакция вокругweb-request-> Transaction with Propagation = RequestNew для Method1-> Transaction with Propagation = Требуется для Method2, как Spring делает управление транзакциями для обеспечения выполнения транзакций в правильном контексте с правильным заказом?

В случае иерархии транзакций среда Spring соответствующим образом генерирует проверки Transaction Advisor.В приведенном выше примере

  • для метода 1 (RequestNew) Код помощника транзакции (или уведомление о транзакции) будет всегда создавать новую транзакцию.
  • для метода 2 (обязательно) Советник транзакцийкод (или уведомление о транзакции) будет проверять существующую транзакцию и использовать ее, если она существует, или создать новую транзакцию.

На странице документации пружины есть изображение , которое очень хорошо суммирует эти аспекты.

Typical Spring Transaction Management

Надеюсь, это поможет.

4 голосов
/ 23 декабря 2011
Controller
@Transactional
public void sequence() {
  method1();
  method2();
}

@Transactional
void method1() {
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
void method2() {
}

Распространение по умолчанию ТРЕБУЕТСЯ (Поддержите текущую транзакцию, создайте новую, если ее не существует.) Поэтому m1 будет использовать Транзакцию, запущенную в Контроллере.m2 помечается как REQUIRES_NEW (создайте новую транзакцию, приостановите текущую транзакцию, если она существует.) Порядок транзакции - это порядок, который вы вызываете транзакционными методами.

Controller
begin tx1
   |--------------------> m1 (uses tx1)
   |
   | begin tx2
   |--------------------> m2 (uses tx2)
   | commit tx2
commit tx1
0 голосов
/ 23 декабря 2011

Вы прочитали документацию Spring ? В основном АОП используется для управления транзакцией. Вам также следует прочитать документацию AOP . Если документации AOP недостаточно, я предлагаю вам пройтись по коду. Было бы неплохо выполнить код в режиме отладки с точкой останова.

...