Предисловие
Адрес загрузки образца кода для этой статьи (полностью запускается, включая файлы SQL, измените конфигурацию базы данных после загрузки): Нажмите здесь, чтобы загрузить
Несколько операций базы данных контролируются в целом, и они преуспевают или проваливаются вместе.
Атомность: относится к транзакции, являющейся неотъемлемой единицей работы, и эксплуатации в транзакции либо происходят, либо не происходит.
Последовательность: означает, что целостность данных до и после транзакции должна быть согласованной.
Изоляция: когда несколько пользователей получают доступ к базе данных одновременно, транзакции одного пользователя не могут быть вмешательны транзакциями других пользователей, и данные между несколькими параллельными транзакциями должны быть выделены друг от друга.
Постоянство: как только транзакция будет совершена, ее изменения в данных в базе данных являются постоянными, и сбой мгновенной базы данных не должен оказывать на нее какого -либо влияния.
-Платформенный транзакция Manager Manager (Commit, Offback Transactions)
Spring предоставляет различные реализации интерфейса интерфейса платформы для различных структур постоянства. нравиться:
Использование DataSourCetransActionManager при постоянных данных с использованием Spring JDBC или ibatis
Используйте HibernateTrancectionManager при использовании hibernate3.0 для постоянных данных
-Информация о определении транзакции транзакции транзакции (изоляция, распространение, тайм-аут, только для чтения)
Грязное чтение: одна транзакция гласит данные, которые были переписаны другой транзакцией, но еще не были представлены. Если эти данные откатаются, данные чтения недействительны.
Нет повторяющегося считывания: в одной и той же транзакции результаты, возвращаемые путем чтения одних и тех же данных, несколько раз разные.
Фэнтезийное чтение: после одной транзакции гласит несколько строк записей, другая транзакция вводит некоторые записи, и происходит фантастическое чтение. В более позднем запросе первая транзакция найдет некоторые записи, которые не были доступны изначально.
Уровень изоляции транзакций: (пять типов)
Среди них MySQL по умолчанию использует уровень изоляции repecatable_read; Oracle по умолчанию использует уровень изоляции Read_committed
Поведение коммуникации транзакций: (семь типов)
-TransactionStatus Специфический статус работы
а Управление транзакциями программирования (на основе управления программированием Java, редко используется)-см. Пакет Demo1
Используйте TransactionTemplate, чтобы инкапсулировать несколько операций DAO
*б. Управление декларативными транзакциями (управление конфигурацией AOP на основе пружины)
- На основании транзакционного прокроксифакторного боя. (Редко используется)-см. Пакет Demo2
Необходимо настройка транзакционного процесса для каждого класса, который подвергается управлению транзакциями для улучшения.
-Са основан на конфигурации XML (часто используется) -see demo3
После настройки ничего не нужно добавить в класс.
Если действие является целевым объектом для ввода транзакции, вам необходимо добавить атрибут Proxy-Target-class = "true" в элемент <AOP: config>. Причина состоит в том, чтобы информировать структуру Spring для использования технологии CGLIB для создания классов действий с функциями управления транзакциями.
-Са на основе аннотаций (простая конфигурация, часто используемая) -Вей пакет Demo4
Включить конфигурацию аннотации транзакции в ApplicationContext.xml. (В ApplicationContext.xml просто определите бобы и добавьте следующие элементы)
<bean id = "txmanager"> <name = name = "sessionFactory"> </property> <TX: управляемая аннотацией транзакция-manager = "txmanager"/>
Используйте @Transactional в классе целевых компонентов, который можно определить перед классом или перед методом.
-Программирование
/ *** @description: DAO -слой интерфейс слоя трансферного дела**/ account public interface addao {/ *** @param out*: трансферная учетная запись* @param money*: передача*/ public void Outmoney (String Out, Double Money); / ** * * @param in *: transfer account * @param money *: передача суммы */ public inmoney (String in, Double Money); } / *** @description: класс реализации слоя DAO в случае передачи*/ public class accountdaoimpl расширяет Jdbcdaosupport Recules AccountDao {/ *** @param Out*: Transfer* @param money*: upport ancome*/ @override public void outmoney (string out, двойные деньги) {string sql = "upput out money in name =? this.getjdbctemplate (). Обновление (SQL, Money, Out); } / *** @param in*: transfer account* @param money*: передача* / @override public inmoney (String in, Double Money) {string sql = "Обновление счета установила деньги = money+? где имя =?"; this.getjdbctemplate (). Обновление (SQL, Money, In); }} / *** @description: бизнес -интерфейс трансферного корпуса**/ accoundservice public interface {/ *** @param out: Transfer* @param in: anpervice account* @param money: transfer atum*/ public void transfer (строка, строка, двойные деньги); } / *** @Description: Класс внедрения бизнес -уровня в случае трансферного дела*/ public Class AccounderviceImpl реализует Accountservice {// DAO Private AccountDao AccountDAO; // Шаблон для инъекции управления транзакциями частная транзакция TransactionTemplate; / ** * @param out *: Transfer * @param in *: transfer account * @param money *: передача */ @override public void transfer (окончательная строка, окончательная строка, окончательные двойные деньги) {// Если исключение происходит во время процесса, предыдущая операция может быть завершена. Если последнее не может, передача успешна, но передача не получена. // accountdao.outmoney (out, деньги); // int i = 1/0; // accountdao.inmoney (in, деньги); TransactionTemplate.Execute (New TransactionCallbackWithOutesult () {@Override Protected void doIntransactionWithoutresult (TransactionStatus TransactionStatus) {accountDao.outmoney (out, деньги); // int i = 1/0; accountdao.inmoney (in, money); } public void setAccountdao (AccountDao AccountDao) {this.Accountdao = accountDao; } public void setTransactionTemplate (TransactionTemplate TransactionTemplate) {this.TransactionTemplate = TransactionTemplate; }}ApplicationContext1.xml
<!-Представьте файлы внешних свойств-> <context: property-placeholder location = "classpath: jdbc.properties" /> <!-configure c3p0 пул соединений-> <bean id = "dataSource"> <Property name = "value" value = "$ {jdbc.driverclass}" /> <name = "jdbcurl" kval <name = "user" value = "$ {jdbc.username}" /> <name = "password" value = "$ {jdbc.password}" /> < /bean> <!-Настроить класс бизнес-уровня-> <bean id = "accountservice"> <property name = "accountDao" ref = 'accoentdao " /> <! name = "transactionTemplate" ref = "transactionTemplate" /> < /bean> <!-Настройка класса DAO (упрощенный, JDBCtemplate будет автоматически настроен)-> <Bean Id = "AccountDao"> <Свойство = "DataSource" ref = "DataSource" /> < /bean> <! id = "jdbctemplate"> <property name = "dataSource" ref = "dataSource" /> < /bean> <bean id = "accountdao"> <name = "jdbctemplate" ref = "jdbctemplate" /> < /bean>-> <!- ============================================================================================ ============================================================================================= ============================================================================================= ============================================================================================= Настройка шаблона управления транзакциями: классы, предоставленные Spring, для упрощения кода управления транзакциями -> <bean id = "transactiontemplate"> <name = "transactionManager" ref = "TransactionManager"/> </bean>тест:
@Runwith (springjunit4classrunner.class) @contextConfiguration ("classPath: ApplicationContext1.xml") public class transactiontest {@resource (name = "accountservice") private AccountService; @Test public void demo1 () {accountservice.transfer ("aaa", "bbb", 200d); }}-Метод, основанный на транзакционном процессе
открытый класс AccountServiceImpl реализует AccountService {// DAO Private Account AccountDao; / ** * @param out *: перевести * @param in *: transfer account * @param money *: передача */ @override public void Transfer (String Out, String in, Double Money) {accountdao.outmoney (out, money); // int i = 1/0; accountdao.inmoney (in, деньги); } public void setAccountdao (AccountDao AccountDao) {this.Accountdao = accountDao; }}ApplicationContext2.xml
<!-Представьте файлы внешних свойств-> <context: property-placeholder location = "classpath: jdbc.properties" /> <!-configure c3p0 пул соединений-> <bean id = "dataSource"> <Property name = "value" value = "$ {jdbc.driverclass}" /> <name = "jdbcurl" kval <name = "user" value = "$ {jdbc.username}" /> <name = "password" value = "$ {jdbc.password}" /> < /bean> <!-Конфигурировать класс бизнес-уровня-> <bean id = "bean service"> <property name = "AccountDAO" upported account accountao " /> < /bean> < /bean> < /bean> < /bean> < /bean> < /bean> <! Настройте JDBCTEMPLATE)-> <Bean ID = "AccountDao"> <name = "dataSource" ref = "dataSource" /> < /bean> <!- ========================================================================================== ========================================================================================== ========================================================================================== ========================================================================================== -> <!-Настройка менеджера транзакций-> <bean id = "transactionManager"> <name = "dataSource" ref = "dataSource" /> < /bean> <!-Настройте прокси для бизнес-уровня-> <Bean Id = "AccecterviceProxy"> <!-Конфигурирование Target Object-> <perity vame = "ref-refsecrice"! <name Property = "transactionManager" ref = "transactionManager"> </property> <!-свойства инъекции транзакции-> <name = "name =" transactionAttributes "> <props> <!-Формат Prop:* Распространение: поведение распространения транзакций* Изотация: sturaction vesolation. Transactions-> <prop key = "transfer"> opragation_required </prop> <!-<prop key = "transfer"> opragation_required, readonly </prop>-> <!-<prop key = "> propagation_required, readonly </prop>-> <!-<prop key ="> propagation_required,+Java </props> </property> </bean>тест:
@Runwith (springjunit4classrunner.class) @contextConfiguration ("classPath: ApplicationContext2.xml") открытый класс TransactionTest { / *** Будьте в курсе прокси -класса: потому что прокси -класс выполняет усиленные операции* / // @resource (name = "accoundserse) @resour (nameprice = amessy -namessy =" amessy -namessy = "ampoxy -namesy =" amessy -namesy amersy -namesy amesr Учетная служба счетов; @Test public void demo1 () {accountservice.transfer ("aaa", "bbb", 200d); }}-На основе конфигурации XML
открытый класс AccountServiceImpl реализует AccountService {// DAO Private Account AccountDao; / ** * @param out *: перевести * @param in *: transfer account * @param money *: передача */ @override public void Transfer (String Out, String in, Double Money) {accountdao.outmoney (out, money); // int i = 1/0; accountdao.inmoney (in, деньги); } public void setAccountdao (AccountDao AccountDao) {this.Accountdao = accountDao; }}ApplicationContext3.xml
<!-Представьте файлы внешних свойств-> <context: property-placeholder location = "classpath: jdbc.properties" /> <!-configure c3p0 пул соединений-> <bean id = "dataSource"> <Property name = "value" value = "$ {jdbc.driverclass}" /> <name = "jdbcurl" kval <name = "user" value = "$ {jdbc.username}" /> <name = "password" value = "$ {jdbc.password}" /> < /bean> <!-Конфигурировать класс бизнес-уровня-> <bean id = "bean service"> <property name = "AccountDAO" upported account accountao " /> < /bean> <! Настройте JDBCTEMPLATE)-> <Bean ID = "AccountDao"> <name = "dataSource" ref = "dataSource" /> < /bean> <!- ======================================================================= ======================================================================= ======================================================================= ======================================================================= ======================================================================= ======================================================================= ======================================================================= ======================================================================= : Распространение транзакции. Изоляция:> Уровень изоляции транзакции. Только для чтения: только для чтения откат-от: какие исключения произошли без роллера-от: какие исключения произошли, а не откат. <aop: pointcut Expression = "execution (* com.zs.spring.demo3.accountservice+.* (..))" id = "pointcut1"/> <!-раздел конфигурации-> <aop: Advisor Asse-ref = "txadvice" pointcut-ref = "pointcut1"/> </aop: config>тест:
/ *** @Description: Спорный метод управления декларативной транзакцией два: на основе аспекта конфигурации XML*/ @runwith (springjunit4classrunner.class) @contextconfiguration ("classpath: ApplicationContext3.xml") Public Classtest {/ ** должен внедрить класс Proxy: потому что Proxy Classcom «Учетная служба») частная счетная счетная сервис; @Test public void demo1 () {accountservice.transfer ("aaa", "bbb", 200d); }}-Основано на аннотации
/ *** @transactional Распространение: Распространение транзакции Изоляция: Уровень изоляции транзакции. Читает: только для чтения* Rollbackfor: какие исключения произошли в норвелке: какие исключения не произошли. класс AccountServiceImpl реализует AccountService {// DAO Injecting Transfer Private Accountdao AccountDao; / *** @param out*: ancressperation account* @param in*: transfer account* @param money*: передача*/ @override public void transfer (String Out, String in, Double Money) {accountdao.outmoney (out, money); // int i = 1/0; accountdao.inmoney (in, деньги); } public void setAccountdao (AccountDao AccountDao) {this.Accountdao = accountDao; }}ApplicationContext4.xml
<!-Представьте файлы внешних свойств-> <context: property-placeholder location = "classpath: jdbc.properties" /> <!-configure c3p0 пул соединений-> <bean id = "dataSource"> <Property name = "value" value = "$ {jdbc.driverclass}" /> <name = "jdbcurl" kval <name = "user" value = "$ {jdbc.username}" /> <name = "password" value = "$ {jdbc.password}" /> < /bean> <!-Конфигурировать класс бизнес-уровня-> <bean id = "bean service"> <property name = "AccountDAO" upported account accountao " /> < /bean> < /bean> < /bean> < /bean> < /bean> < /bean> <! Настройте JDBCTEMPLATE)-> <Bean ID = "AccountDao"> <name = "dataSource" ref = "dataSource" /> < /bean> <!- ========================================================================================== ========================================================================================== ========================================================================================== ========================================================================================== Configure Transaction Manager-> <bean id = "transactionManager"> <name = "dataSource" ref = "dataSource"/> </bean> <!-Включите транзакцию аннотации-> <TX: управляемый аннотацией Transaction-Manager = "TransactionManager"/>тест:
@Runwith (springjunit4classrunner.class) @contextConfiguration ("classPath: ApplicationContext4.xml") Открытый класс TransactionTest { / *** Обязательно вводите класс Proxy: поскольку класс Proxy выполняет усиленные операции* / @Resource (name = "accounts") частные акценты; @Test public void demo1 () {accountservice.transfer ("aaa", "bbb", 200d); }}Для конкретного кода и файла базы данных Справочный проект Полный код: Полный код:
http://xiazai.vevb.com/201805/yuanma/spring-transaction_jb51.rar
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.