Позволяет сделать несколько основных утверждений.
- Транзакционный контекст - это среда, в которой некоторые специальные свойства (сеанс базы данных) становятся доступными для среды выполнения приложения, которые в противном случае недоступны.Контекст транзакции обычно используется для определения объема транзакции.
- Spring использует AOP Proxies и метаданные XML для достижения декларативного управления транзакциями.
- Аннотации используются для обозначения поведения распространения транзакции определенного метода.
- 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 (обязательно) Советник транзакцийкод (или уведомление о транзакции) будет проверять существующую транзакцию и использовать ее, если она существует, или создать новую транзакцию.
На странице документации пружины есть изображение , которое очень хорошо суммирует эти аспекты.
Надеюсь, это поможет.