Эта статья в основном изучает соответствующее содержание механизма транзакций Spring, следующим образом.
Обычно существует две стратегии транзакций: глобальные транзакции и локальные транзакции. Глобальные транзакции могут охватывать несколько транзакционных ресурсов (то есть источники данных, обычно базы данных и очереди сообщений) и обычно требуют управления серверами приложений J2EE, что требует поддержки JTA сервера внизу. Местные транзакции связаны с технологией настойчивости, принятой основным уровнем. Если базовый уровень напрямую использует JDBC, объект соединения должен использоваться для работы транзакции. Если используется технология стойкости спяченности, вам необходимо использовать объект сеанса для эксплуатации транзакции.
Как правило, процесс программирования с использованием транзакций JTA, транзакций JDBC и транзакций Hibernate, примерно следующим образом.
Как видно из приведенного выше рисунка, используя традиционное программирование транзакций, код программы должен сочетаться с API конкретных политик транзакций. Если приложение необходимо изменить стратегию, это означает, что код должен быть значительно изменен. Но если вы используете весенние транзакции, проблем не будет.
SRING не предоставляет никакой поддержки транзакций, он отвечает только за упаковку основных транзакций, а на уровне весны он предоставляет унифицированный API программирования для внешнего мира. Ядром пружинной транзакции является интерфейс PlatformTransactionManager.
PlatformTransactionManager представляет интерфейс транзакции, который не зависит от конкретного типа и может представлять любую транзакцию, включая транзакции JDBC, транзакции Hibernate и даже транзакции JTA.
Механизм транзакции Springa является типичной политической моделью. PlatformTransactionManager представляет интерфейс управления транзакциями, но не знает, как управлять транзакциями. Это требует только управления транзакциями для предоставления трех методов: gateTransaction getTransaction(), commit() транзакции и rollback() Тем не менее, конкретная реализация оставлена в своем классе реализации для завершения. Программисты должны только настроить тип транзакции в файле конфигурации в соответствии с используемым типом транзакции. Базовая пружина автоматически использует конкретный класс реализации транзакции для выполнения операций транзакций. Для программистов им вообще не нужно заботиться о базовом процессе, им нужно только программировать для интерфейса PlatformTransactionManager. Интерфейс PlatformTransactionManager предоставляет следующие методы: getTransaction(..), commit(); rollback(); Это все операции транзакций, которые не связаны с платформой.
Полное написание getTransaction() - это TransactionStatus getTransaction(TransactionDefinition definiton)
Этот метод используется для возврата объекта транзакции, а параметр TransactionDefinition может указывать различные атрибуты для объекта транзакции. Обычно он может указывать атрибуты изоляции транзакции, атрибуты распространения, тайм -аут и прочитать только эти атрибуты.
Конкретное управление транзакциями Spring требует, чтобы PlatformTransactionManager был настроен в файле конфигурации. Ниже приведена конфигурация пружины, соответствующую различным типам транзакций.
Конфигурация локального менеджера транзакций источника данных JDBC заключается в следующем:
<!-Определите источник данных, используйте источник данных C3P0, чтобы реализовать его, и введите необходимую информацию источника данных-> <Bean Id = "DataSource" Dressome-method = "Close" P: DriverClass = "com.mysql.jdbc.driver" p: jdbcurl = "jdbc: mysql: // localhost" p: root "root" root "=" root "=" root "=" root "=" root "=" root "=" root "=" root "=" root "=" root "=" root "." P: maxpoolsize = "40" P: minpoolsize = "2" p: initialPoolsize = "2" P: maxidletime = "30" /> <!-Настройте локальный диспетчер данных для источника данных JDBC, используйте DataSourcetransaction Manager-> <bean id = "TransactionManager" P: DataSource-Ref = "DataSource" />> " />" /> "transactionManer" P: DataSource-Ref = " /?
Конфигурация GTA Global Transaction Manager для управления контейнерами выглядит следующим образом:
<bean id="dataSource" p:jndiName="jdbc/jpetstore" /><!-- Using the JtaTransactionManager class, this class implements the PlatformTransactionManager interface-><!-- Using JTA global transactions, Spring containers can obtain transactional resources from the Java EE server by themselves without dependency injection--><bean id="transactionManager" />
Для GTA Global Transactions вам нужно только указать класс внедрения менеджера транзакций JTatransActionManager. Контейнер для пружины само по себе получит источник данных с сервера J2EE, без явного введения в диспетчер транзакций.
Конфигурация локальной транзакции пружины, основанная на технологии устойчивого сгибания, заключается в следующем.
<!-Определите источник данных, используйте источник данных C3P0, чтобы реализовать его, и введите необходимую информацию источника данных-> <Bean Id = "DataSource" Dressome-method = "Close" P: DriverClass = "com.mysql.jdbc.driver" p: jdbcurl = "jdbc: mysql: // localhost" p: root "root" root "=" root "=" root "=" root "=" root "=" root "=" root "=" root "=" root "=" root "=" root "." P: maxPoolSize = "40" P: minPoolSize = "2" P: initialPoolsize = "2" P: maxidletime = "30" /> <!-Определите сеансфакторию Hibernate, SessionFactory необходимо полагаться на источник данных, инъекционный DataSource-> <Bean Id = "SessionFactory" P: DataSource-ref = "entaticatedcresse-intatedcresse intatedcasse intatedcasse intatedcasse intated intatedcasse intated intaturedcasse intated intaturedcasse intated intatued intaturedcascess intated intatured intaturedcasse- используется для перечисления всех постоянных классов-> <name = name = "annotatedclasses"> <Sist> <!-Ниже используется для перечисления всех классов PO-> <Daga> com.Entity.User </value> </list> </property> <!-Определите свойство SessionFactory of Hibernate-> <prop-name = "hibernatePerties"> <props> <! key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <!-- Whether to create data tables based on Hibernate mapping tables--> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <!-- Configuring Hibernate's local data manager, using HibernateTrancectionManager Class-> <!-Этот класс представляет собой конкретную реализацию интерфейса PlatformTransactionManager для Hibernate-> <!-Настройка HibernateTrancectionManager требует SessionFactory-> <Bean Id = "TransactionManager" P: SessionFactory-REF = "SessionFactory" />
Если весенние транзакции принимают политику Hibernate, для настройки: источник данных, SessionFactory и Manager.
Если базовый уровень использует технологию устойчивого уровня сгибания, а транзакция использует глобальную транзакцию JTA, конфигурация заключается в следующем:
<!-Настройка источника данных JTA-> <bean id = "dataSource" p: jndiname = "jdbc /jpetstore" /> <!-определить Hibernate sessionFactory. SessionFactory необходимо полагаться на источник данных и ввод DataSource-> <bean id = "sessionFactory" p: dataSource-ref = "dataSource"> <!-аннотированные классы используются для перечисления всех постоянных классов-> <name = "AnnotatedClasses"> <sile> <! </property> <!-Определите свойство SessionFactory of Hibernate-> <Property name = "HibernateProperties"> <props> <!-Укажите диалект соединения Hibernate-> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysql5innodbdialect </dialect "! -> <prop key = "hibernate.hbm2ddl.auto"> update </prop> </props> </property> </bean> <!-Используйте класс JtatransactionManager, который является классом реализации интерфейса PlatformTransactionManager-> <!-Конкретные реализации для управления глобальными транзакциями-> <bean id = "TransactionManager"/> <!
По сравнению с предыдущей пружинной транзакцией на основе Hibernate, это заменить источник данных на источник данных JNDI и заменить менеджер транзакций JtatransactionManager.
Для глобальных транзакций JTA, поскольку требуется поддержка базового сервера приложений, могут быть различия в деталях между глобальными транзакциями JTA, предоставленными различными серверами приложений. Поэтому при фактической настройке глобального менеджера транзакций вам может потребоваться использовать подклассы JTatransActionManager, такие как OC4JTATRANSActionManager, предоставленные сервером приложений Oracle Javaee, WebLogiTatransActionManager, предоставленным Oracle для WebLogic, WebSphereUowTransactionManager, предоставленным IBM для Websphere.
Из конфигурации пружины различных типов транзакций выше можно увидеть, что, когда приложение принимает управление транзакциями пружины, приложение не должно быть связано с конкретным API транзакций. Приложение должно быть запрограммировано только на интерфейс PlatormtransactionManager. ApplicationContext выберет соответствующий класс реализации политики транзакции (т. Е. Класс реализации PlatormtransactionManager) на основе файла конфигурации.
Так что подробно, как выполнить программирование управления транзакциями весной, обычно есть два способа.
Управление транзакциями программирования: он должен непосредственно использовать три абстрактных метода, предоставленные PlatormtransactionManager для управления потоком транзакций в коде. Вы также можете получить бобы типа PlatormtransactionManager в весеннем контейнере. Этот фасоль всегда является экземпляром конкретного класса реализации PlatormtransactionManager. Конкретный класс реализации выбирается ApplicationContext в соответствии с шаблоном политики. Программистам не нужно заботиться об этом, им нужно только программировать интерфейс, ориентированные на интерфейс.
Управление декларативными транзакциями: этот метод не требует, чтобы процесс управления транзакциями был записан в код, но использует AOP для полного завершения транзакции через файлы конфигурации. То есть файлы конфигурации XML могут настроить транзакционные агенты для бизнес -компонентов, а транзакционные агенты обеспечивают управление транзакциями для бизнес -компонентов. Теперь этот метод является лучшим, с наименьшим вторжением исходного кода.
При использовании декларативных транзакций вам нужно только написать файл конфигурации и настроить типы компонентов, которые требуют управления транзакцией. Бизнес -компоненты будут переплетены в управлении транзакциями в рамках механизма AOP, и программистам не нужно писать какой -либо код управления транзакциями и может сосредоточиться на разработке компонентов бизнеса. Поэтому обычно рекомендуется декларативное управление транзакциями.
Метод Spring XML схемы обеспечивает краткую стратегию конфигурации транзакции. Он настраивает обработку улучшения транзакций через пространство имен <tx:advice> , где можно указать различные атрибуты транзакции (например, атрибуты изоляции, атрибуты распространения, тайм-аут, атрибуты только для чтения, и т. Д.), И затем улучшение транзакции может быть связано с входом AOP (I.E. Метод выполнения. в операции транзакций. Вот простой пример, настраиваемая компонента NewsDaoImpl для операций с данными, используя источник данных C3P0, менеджер транзакций JDBC Spring и настройки свойств для транзакций в <TX: Advice.
Полная конфигурация пружины заключается в следующем:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.spramework.orgg/schema" xmlns: p = "http://www.springframework.org/schema/p" xmlns: aop = "http://www.springframework.org/schema/aop» xmlns: tx = "http://wwww.springframe.orns: tx =" http://wwww.springform. xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.spramework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/tx/spring-4.0.s.> defsdine. Бин, используйте источник данных C3P0, чтобы реализовать его, и введите необходимую информацию источника данных-> <Bean Id = "DataSource" Drest Method = "close" P: DriverClass = "com.mysql.jdbc.driver" p: jdbcurl = "jdbc: mysql: // localhost/test? UseUnicode = ut & inticoditing = ut & itf-necumding = untf-necumditing = ut & itf-necumditing = ut & incorencoditing = ut & atf-necumditing = ut & intarencoding = untf-8. P: user = "root" p: password = "" p: maxpoolsize = "40" p: minpoolsize = "2" p: pironarpoolsize = "2" p: maxidletime = "30" /> <!-Настройте локальный менеджер данных JDBC Data Source, используйте DataSourcetransactionManager-> <bean id = "TransCationManager" P: dataSceRancepransactionManager-> <bean id = "dataSceSemource-dataSceS. /> <!-Настройте бизнес-логику Bean-> <Bean Id = "NewsDao" P: DS-REF = "DataSource" /> <!-Настройка обработки улучшения транзакций, указать менеджер транзакций-> <TX: ARDED ID = "TXADVICE" Transaction-Manager = "TransactionManager"> <!-Используется для конфигурирования Details Definess-Transaction-manager = "TransactionManager"> <! с get is is hide-only-> <tx: method name = "get*" read-only = "true" /> <!-Все остальные методы по умолчанию подлежат транзакциям, определяя тайм-аут 5 секунд-> <tx: имя метода = "*" изоляция = "Default" Propagation = "требуется" timeout = "5" /> < /tx: attribute> <pearture> <pecure> <pecure> <pecure> <pecure> <pecure> <pecure> <pecure> <pecure> <pecure> Сопоставьте выполнение всех методов во всех классах IMP-концов в пакете IMP-> <aop: pointcut Expression = "execution (*com.dao.impl. /> <!-Настройте другую точку входа, чтобы соответствовать выполнению всех методов в классе, начиная с ABC в пакете IMP-> </aop: config> </beans>
В коде NewsDaoImpl он должен вставить дубликаты данных в таблицу.
Пакет com.dao.impl; import javax.sql.datasource; импорт org.springframework.jdbc.core.jdbctemplate; импорт com.dao.newsdao; открытый класс новости. Вставьте (название строки, строковое содержимое) {// Использование пула данных C3P0 JDBCTEMPLATE JT = new JDBCTEMPLATE (DS); JT.Update («Insert in News_inf» + «значения (100,? управление, первая запись может быть вставлена // Если будет добавлен управление транзакции, первая запись не будет вставлена}}Вот метод испытания.
public static void test3 () {ApplicationContext ctx = new classpathxmlapplicationcontext ("beans4jdbc.xml"); // Получить агент по транзакциям Bean Newsdao dao = (newsdao) ctx.getbean ("newsdao", newsdao.class); Dao.insert («Основная идея программирования Java», «Легкая Java EE Development»); System.out.println («выполнение завершено»); }Выполнение метода испытаний обнаружит, что исключение будет добавлено (из -за дубликатов данных), и из -за управления транзакциями в базе данных не будет введения данных.
Как вы можете видеть в приведенном выше примере, обычно в конфигурации схемы XML, конфигурация AOP фактически выполняется для обычного боба, и включено улучшение советов. Усовершенствование консультаций настроено с помощью менеджера транзакций, который опирается на источник данных.
Для <aop: Advisor>, связывание советов и точки входа выполняется постпроцессором боба в нижней части весны (например, Beannameautoproxycreator, DefaultAdvisoroProxycreator), который, по сути, является динамичным прокси.
Кроме того, в улучшении конфигурации <TX: ADVICE> вы также можете указать, что, когда встречается конкретное исключение, принудительно откат и принудительный откат, то есть откат for = "xxxexception", no-rollback-for = "xxxexception"
В дополнение к использованию методов схемы XML, вы также можете напрямую добавить аннотацию @Transaction к методу, чтобы этот метод обладал транзакционными свойствами. В @Transaction могут быть настроены различные свойства для транзакций (например, свойства изоляции, свойства распространения, тайм-ауты, свойства только для чтения и т. Д.). Кроме того, необходимо добавить в конфигурацию XML конфигурацию <TX: Annotation, ориентированная на аннотацию, указывая на то, что Spring будет настроить агент транзакции в соответствии с аннотацией, так что конфигурация свойства транзакции и конфигурация вырезания AOP может быть завершена только на одном шаге (непосредственно через конфигурацию аннотации на имени метода).
<TX: управляемая аннотациями транзакция-manager = "transactionManager" />
Newsdaoimpl.
@Transactional (Propagation = Propagation.Required, osolation = osolation.default, timeout = 5) @OverridePublic void insert (строка заголовка, строка содержимого) {Выше приведено все содержание этой статьи о примере механизма транзакции Spring, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!