Главная » Spring » Объявление транзакций в XML Spring

0

В предыдущих версиях Spring объявление транзакций было связа- но с внедрением специального компонента TransactionProxyFactoryBean. Проблема с компонентом TransactionProxyFactoryBean состоит в том, что его использование ведет к разбуханию конфигурационных файлов Spring. К счастью, в настоящее время эта проблема была устранена, и теперь фреймворк Spring предлагает конфигурацион-

ное пространство имен tx, существенно упрощающее использование декларативных транзакций в Spring.

Чтобы использовать пространство имен tx, необходимо добавить его в конфигурационный XML-файл Spring:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx=”http://www.springframework.org/schema/tx” xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd”>

Обратите внимание, что при этом также необходимо включить пространство имен aop. Это очень важно, потому что некоторые эле- менты настройки декларативных транзакций опираются на отдель- ные элементы настройки AOP (представленные в главе 5).

Пространство имен tx содержит несколько новых конфигура- ционных XML-элементов, наиболее примечательным из которых является <tx:advice>. Следующий фрагмент XML-файла демонстри- рует, как можно использовать элемент <tx:advice> для объявления транзакции, подобной той, что была определена для службы Spitter в листинге 7.2:

<tx:advice   id="txAdvice">

<tx:attributes>

<tx:method name="add*" propagation="REQUIRED" />

<tx:method  name="*"  propagation="SUPPORTS" read-only="true"/>

</tx:attributes>

</tx:advice>

Атрибуты транзакции внутри элемента <tx:advice> определяются элементом <tx:attributes>  с помощью одного или более элементов

<tx:method>. Элемент <tx:method> определяет атрибуты транзакции для метода (или методов), указанного в атрибуте name (допускается ис- пользование шаблонных символов).

Элемент <tx:method> имеет несколько атрибутов, помогающих определять поведение транзакции, которые перечислены в табл. 7.4.

Таблица 7.4. Пять сторон пятиугольника поведения транзакции (рис. 7.3) определяются атрибутами элемента <tx:method>

Атрибут

Описание

isolation

Определяет уровень изоляции транзакции

propagation

Определяет правила распространения транзакции

read-only

Определяет режим доступа к данным

Правила отмены:

rollback-for

no-rollback-for

rollback-for определяет проверяемые исключения,

при появлении которых транзакция должна отменяться. no-rollback-for определяет исключения, при появлении которых транзакция не должна отменяться

timeout

Определяет предельное время ожидания для транзакций, выполняющихся продолжительное время

Согласно определению совета txAdvice транзакции, методы, на ко- торые распространяется эта транзакция, делятся на две категории: имена которых начинаются с add и все остальные. Метод saveSpittle() попадает в первую категорию и объявляется как обязательно выпол- няющийся в рамках транзакции. Остальные методы определяются с правилом propagation="supports" – они не требуют выполнения в рам- ках транзакции, только если таковая существует.

При объявлении транзакции с помощью элемента <tx:advice> все еще необходим диспетчер транзакций, как при использовании ком- понента TransactionProxyFactoryBean. В случае с элементом <tx:advice> предполагается, что диспетчер транзакций будет объявлен как ком- понент с идентификатором transactionManager. Если в конфигурации диспетчеру транзакций присвоено другое имя (например, txManager), необходимо указать этот идентификатор в атрибуте transaction- manager:

<tx:advice id="txAdvice"

transaction-manager="txManager">

</tx:advice>

Сам по себе элемент <tx:advice> определяет только совет аспек- та для применения к методам, требующим выполнения в рамках транзакций. Но это лишь совет, а не полноценный аспект. Нигде в элементе <tx:advice> не указывается, к какому компоненту при- меняется этот совет, – для этого необходимо определить срез мно- жества точек внедрения. Чтобы создать полное определение аспекта транзакции, следует определить объект-советник. Именно для этого

и необходимо пространство имен aop. Следующий фрагмент XML- файла определяет объект-советник, использующий совет txAdvice для применения к любым компонентам, реализующим интерфейс SpitterService:

<aop:config>

<aop:advisor

pointcut="execution(*    *..SpitterService.*(..))" advice-ref="txAdvice"/>

</aop:config>

В атрибуте pointcut используется выражение AspectJ выборки то- чек внедрения, указывающее, что этот объект-советник должен при- менить совет ко всем методам интерфейса SpitterService. Перечень методов, выполняющихся в рамках транзакции, а также атрибуты транзакции определяются самим советом txAdvice, на который ссы- лается атрибут advice-ref  совета.

Несмотря на то что элемент <tx:advice> несет немало удобств в создании декларативных транзакций, тем не менее в Spring 2 име- ется еще одна возможность, которая выглядит еще более привлека- тельной для тех, кто работает в окружении Java 5. Посмотрим, как можно управлять транзакциями с помощью аннотаций.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии