1. Когда Mybatis используется отдельно, используйте SQLSession для обработки транзакций:
открытый класс mybatistxtest {private static sqlSessionFactory sqlSessionFactory; частный статический читатель читателя; @Beforeclass public static void setupbeForeClass () выбрасывает exception {try {reduress = resources.getResourCeasReader ("configuration.xml"); sqlSessionFactory = new sqlSessionFactoryBuilder (). Build (Reader); } наконец {if (reader! = null) {reader.close (); }}} @Test public void updateUsertStest () {sqlSession Session = sqlSessionFactory.opensession (false); // Откройте сеанс, и транзакция запускается try {iusermapper mapper = session.getmapper (iusermapper.class); Пользователь пользователя = новый пользователь (9, «Тестовая транзакция»); int intecualCount = mapper.updateUser (пользователь); // Оператор Commit не был выполнен из -за последующего исключения пользователя пользователя = новый пользователь (10, «Тестовая транзакция непрерывно»); int intemptCount2 = mapper.updateUser (user2); // оператор коммита int i = 2/0 не выполняется из -за последующего исключения; // Исключение времени выполнения запускается Session.commit (); // отправить сеанс, то есть коммит транзакций} наконец {session.close (); // закрыть ресурсы сеанса и выпуска}}}
2. После интеграции с пружиной используйте управление транзакциями Spring:
Одна из основных причин использования Mybatis-Spring заключается в том, что он позволяет Mybatis участвовать в управлении транзакциями Spring. Вместо того, чтобы создавать новый специфический менеджер транзакций для Mybatis, Mybatis-Spring использует DataSourCetransActionManager, который существует весной.
Как только DataSourCetransActionManager настраивается, вы можете настроить транзакции в пружине, как вы обычно делаете. @Transactional Annotation и конфигурация стиля AOP поддерживаются. Во время обработки транзакций будет создано и используется отдельный объект SQLSession. Когда транзакция будет завершена, эта сессия будет совершена или откатится соответствующим образом.
Как только транзакция будет создана, Mybatis-Spring прозрачно управляет транзакциями. Нет необходимости в дополнительном коде в вашем классе DAO или сервиса.
1. Стандартная конфигурация
Чтобы включить обработку транзакций Spring, просто создайте объект DataSourCetransActionManager в файле конфигурации XML Spring:
<bean id = "transactionManager"> <name = "dataSource" ref = "dataSource"/> </bean>
Указанным датом данных, как правило, может быть любой дат данных JDBC, который вы используете Spring. Это включает в себя пул соединений и дат данных, полученный с помощью поиска JNDI.
Обратите внимание, что дат данных, указанный для менеджера транзакций, должен быть тем же источником данных, что и тот, который используется для создания SQLSessionFactoryBean, в противном случае менеджер транзакций не будет работать.
2. Транзакции управления контейнерами
Если вы используете контейнер JEE и хотите, чтобы Spring участвовала в транзакциях управления контейнерами, Spring следует настроить с помощью JTatransActionManager или его подкласса, определенного контейнером. Самый удобный способ сделать это - использовать пространство имен транзакций Spring:
<TX: JTA-Transaction-Manager/>
В этой конфигурации Mybatis будет таким же, как и другие ресурсы пружинной транзакции, настроенные с помощью транзакций управления контейнерами. Spring автоматически будет использовать любые существующие транзакции контейнеров, прикрепляя к нему SQLSession. Если транзакция не запускается, или если требуется транзакция, пружина позволит новому контейнеру управлять транзакциями.
Обратите внимание, что если вы хотите управлять транзакциями с использованием контейнеров, а не управления транзакциями Spring, вы должны настроить SQLSessionFactoryBean для использования основного MyBatis ManagedTransactionFactory, а не любого другого менеджера по транзакциям Spring:
<bean id = "sqlSessionFactory"> <name = "dataSource" ref = "dataSource"/> <name = "transactionFactoryClass"> <Dague> org.Apache.ibatis.transaction.Managed.ManagedTransactionFactory "/> </propetion> </bean>
3. Управление транзакциями программирования
SQLSession Mybatis предоставляет указанный метод для обработки программных транзакций. Но при использовании Mybatis-Spring, боб будет вводится с помощью SQLSession или Mapper, управляемого пружиной. Это означает, что пружина обычно обрабатывает транзакции. Вы не можете позвонить в sqlsession.commit (), sqlsession.rollback () или sqlsession.close () методы на пружине SQLSession. Если вы сделаете это, будет выброшено UnsupportedOperationException. Обратите внимание, что эти методы не могут быть доступны при использовании инъекционных картинов. Независимо от того, установлено ли соединение на автокоммит или нет, выполнение метода данных SQLSession или любого вызова метода Mapper за пределами пружинной транзакции будет автоматически. Вот пример транзакции программирования:
DefaultTransactionDefinition def = new DefaultTransactionDefinition (); DEF.SetPropagationBehavior (TransactionDefinition.Propagation_Required); TransactionStatus status = txmanager.getTransaction (def); try {usermapper.insertuser (пользователь); } catch (myexception ex) {throw ex; } txmanager.commit (status);4.@Метод транзакции:
Создайте файл Beans-da-tx.xml в классе и добавьте конфигурацию транзакции на основе Beans-da.xml (серия V):
<!-Manager транзакции-> <bean id = "txmanager"> <name = "dataSource" ref = "dataSource" /> < /bean> <!-Драйвер аннотации транзакции, классы и методы, отмеченные @Transactional, будут транзакционными-> <tx: Annotation-управляемый Transaction-Manager = "TXMANAGE
Категория обслуживания:
@Service ("userservice") открытый класс userservice {@autowired iusermapper mapper; public int batchupdateUserswhenexception () {// не транзакционный пользователь пользователь = новый пользователь (9, «перед исключением»); int intecualCount = mapper.updateUser (пользователь); // выполнение успешного пользователя пользователя2 = новый пользователь (10, "после исключения"); int i = 1/0; // Выбросить исключение времени выполнения int intivicCount2 = mapper.updateUser (user2); // не выполнены, если (infulCount == 1 && intemptCount2 == 1) {return 1; } return 0; } @Transactional public int txupdateUserswhenexception () {// user user user = новый пользователь (9, «перед исключением»); int intecualCount = mapper.updateUser (пользователь); // откат из -за последующего исключения пользователь пользователь2 = новый пользователь (10, «после исключения»); int i = 1/0; // Выбросить исключение времени выполнения и операция с операцией int intivicCount2 = mappper.updateUser (user2); // не выполнены, если (infulCount == 1 && intemptCount2 == 1) {return 1; } return 0; }}В тестовом классе:
@Runwith (springjunit4classrunner.class) @contextconfiguration (locations = {"classpath: beans-da-tx.xml"}) открытый класс SpringintegrateTxtest {@Resource userservice userservice; @Test public void UpdateUsersexceptionTest () {userservice.batchupdateuserswhenexception (); } @Test public void txupdateUsersexceptiontest () {userservice.txupdateuserswhenexception (); }}
5. Метод TransactionTemplate
Добавить в фасоль-da-tx.xml:
<bean id = "txtemplate"> <constructor-arg type = "org.springframework.transaction.platformtransactionmanager" ref = "transactionManager" /> < /bean>
Присоединяйтесь к классу пользователей:
@Autowired (требуется = false) transactiontemplate txtemplate; public int txupdateUserswhenexceptionviatxtemplate () {int retval = txtemplate.execute (new TransactionCallback <Integer> () {@override public integer dointransaction (transactionStatus status) {// Операция операции пользователь = новый пользователь (9, «до исключения»); int затронут = mapcer.upper.upper.uper user user = user user upectacle ( / / intscust upectrabte.uptrabt.uptrace); Последующее исключение пользователь2 = новый пользователь (10, "после исключения"); return returnval; }Добавить в класс SpringIntegratetTxtest:
@Test public void UpdateUserswhenexceptionViatXtemplateTest () {userService.txupDateUserswhenexceptionViatxTemplate (); //}Примечание. Не удается поймать исключение или Runtimeexception без броски:
@Transactional public int txupdateuserswhenexceptionandcatch () {// транзакционная операция, но периферийная структура не может поймать исключение и отправить его, если выполнение верно. try {user user = новый пользователь (9, «перед исключением»); int intecualCount = mapper.updateUser (пользователь); // выполнение было успешным пользователем user2 = новый пользователь (10, «после исключения»); int i = 1/0; // Выбросить исключение времени выполнения int intivicCount2 = mapper.updateUser (user2); // не выполнены, если (infulCount == 1 && intemptCount2 == 1) {return 1; }} catch (Exception e) {// Все исключения пойманы без броска e.printstacktrace (); } return 0; }