Давайте сделаем несколько основных заявлений.
- Контекстный контекст - это среда, в которой некоторые особые свойства (сеанс базы данных) становятся доступными для среды выполнения приложения, которые в противном случае недоступны. Контекст транзакции обычно используется для охвата транзакции.
- Spring использует AOP Proxies и XML-метаданные для достижения декларативного управления транзакциями.
- Аннотации используются для обозначения поведения распространения транзакций определенного метода.
- Spring использует Interceptor Mechanism для применения транзакции по методам.
Здесь я повторно использовать пример дают по @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 прокси для методов, обозначенных для транзакции. Проще говоря, эти прокси-серверы - это не что иное, как обертка вокруг соответствующих методов.
- Внутри этих методов обёртки до и после Код транзакции также генерируется в зависимости от конфигурации (а именно, распространения транзакции).
- Теперь, когда вызывается эти методы обёртки Советник по транзакциям входит в изображение до и после фактического вызова метода. ,
Представляя то же самое в псевдокоде для приведенного выше примера
ProxyMyClass{
MyClass myclass;
.
.
.
sequence(){
//Transaction Advisor code (Typically begin/check for transaction)
myclass.sequence();
//Transaction Advisor code(Typically rollback/commit)
}
.
.
.
}
Вот как пружинные менеджеры сделки. Однако небольшое упрощение.
Теперь, чтобы ответить на ваши вопросы,
.Как делает Spring знать, чтобы совершать обновления базы данных после успешной сделки? Есть ли какая-то ссылка на реализацию Spring, которая выполняет управление транзакциями?
Когда вы вызываете метод под транзакцией, вы фактически вызываете прокси-сервер, который сначала выполняет советник транзакции (который начнет транзакцию), а затем вы вызываете фактический бизнес-метод, после завершения которого выполняется другой советник по транзакциям в зависимости от способа возврата метода, транзакции фиксации или возврата).
Поскольку у нас есть иерархия транзакций: транзакция вокруг веб-запроса-> транзакция с распространением = запросNew для метода1-> транзакция с распространением = требуется для метода2, как Spring управляет транзакциями, чтобы гарантировать, что транзакции выполняется в правильном контексте с правильным порядком?
В случае иерархии транзакций весенний фреймворк соответственно генерирует советник по транзакциям. Например, вы упомянули,
- для метода1 (RequestNew) Код транзакции для транзакции (или консультация по сделке) заключался бы в том, чтобы всегда создавать новую транзакцию.
- для метода2 (обязательно) Код консультанта транзакции (или консультация по транзакции) будет проверять существующую транзакцию и использовать ее, если она существует, или создать новую транзакцию.
Существует image on the spring documentation page, который очень красиво суммирует эти аспекты.

Надеется, что это помогает.
Это было невероятное объяснение. Спасибо –
Можете ли вы объяснить, если на диаграмме выше вызывающий абонент является контроллером или веб-запросом? – tintin
@tintin, не имеет значения, является ли вызывающий контроллер или что-то еще. В конце это будет вызов метода от некоторого класса к прокси. – Santosh