javascript
Spring事务配置实例
事務(wù)
一個使用 MyBatis-spring?的主要原因是它允許MyBatis 參與到 Spring 的事務(wù)管理中。而 不是給 MyBatis 創(chuàng)建一個新的特定的事務(wù)管理器,MyBatis-Spring 利用了存在于Spring 中的 DataSourceTransactionManager。
一旦 Spring 的PlatformTransactionManager 配置好了,你可以在 Spring 中以你通常的做 法來配置事務(wù)。@Transactional 注解和AOP(Aspect-Oriented Program,面向切面編程,譯 者注)樣式的配置都是支持的。在事務(wù)處理期間,一個單獨(dú)的 SqlSession對象將會被創(chuàng)建 和使用。當(dāng)事務(wù)完成時,這個 session 會以合適的方式提交或回滾。
一旦事務(wù)創(chuàng)建之后,MyBatis-Spring將會透明的管理事務(wù)。在你的 DAO 類中就不需要額 外的代碼了。
標(biāo)準(zhǔn)配置
要 開 啟 Spring 的 事 務(wù) 處 理 , 在 Spring 的 XML 配 置 文 件中 簡 單 創(chuàng) 建 一 個 DataSourceTransactionManager 對象:
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/> </bean>指定的 DataSource 一般可以是你使用 Spring 的任意 JDBCDataSource。這包含了連接 池和通過 JNDI 查找獲得的 DataSource。要注意, 為事務(wù)管理器指定的 DataSource 必須和用來創(chuàng)建SqlSessionFactoryBean 的 是同一個數(shù)據(jù)源,否則事務(wù)管理器就無法工作了。
容器管理事務(wù)
如果你正使用一個 JEE 容器而且想讓 Spring參與到容器管理事務(wù)(Container?managedtransactions,CMT,譯者注)中,那么 Spring 應(yīng)該使用 JtaTransactionManager 或它的容器指定的子類來配置。做這件事情的最方便的方式是用 Spring 的事務(wù)命名空間:
<tx:jta-transaction-manager/>
在這種配置中,MyBatis 將會和其它由 CMT 配置的 Spring事務(wù)資源一樣。Spring 會自動 使用任意存在的容器事務(wù),在上面附加一個 SqlSession。如果沒有開始事務(wù),或者需要基 于事務(wù)配置,Spring會開啟一個新的容器管理事務(wù)。
注 意 , 如 果 你 想 使 用 CMT , 而 不 想 使 用 Spring 的 事 務(wù)管 理 , 你 就 必 須 配 置 SqlSessionFactoryBean 來使用基本的 MyBatis 的ManagedTransactionFactory 而不是其 它任意的 Spring 事務(wù)管理器:
<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><propertyname="transactionFactory"><beanclass="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/></property> </bean>編程式事務(wù)管理MyBatis 的 SqlSession 提供指定的方法來處理編程式的事務(wù)。 但是當(dāng)使用MyBatis-Spring 時, bean 將會使用 Spring 管理的 SqlSession 或映射器來注入。 那就是說 Spring 通常是處理事務(wù)的。
你 不 能 在 Spring 管 理 的 SqlSession 上 調(diào) 用SqlSession.commit() , SqlSession.rollback() 或 SqlSession.close() 方 法 。 如 果 這 樣做 了 , 就 會 拋 出 UnsupportedOperationException 異常。注意在使用注入的映射器時不能訪問那些方法。
無論 JDBC 連接是否設(shè)置為自動提交, SqlSession 數(shù)據(jù)方法的執(zhí)行或在Spring 事務(wù)之外 任意調(diào)用映射器方法都將會自動被提交。
如果你想編程式地控制事務(wù),請參考 Spring 手冊的 10.6 節(jié)。這段代碼展示了如何手動使用在 10.6.2 章節(jié)描述的 PlatformTransactionManager 來處理事務(wù)。
DefaultTransactionDefinitiondef=newDefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status= txManager.getTransaction(def); try{userMapper.insertUser(user); } catch(MyException ex){txManager.rollback(status);throwex; } txManager.commit(status);注意這段代碼展示了一個映射器,但它也能和 SqlSession 一起使用。?
總結(jié)
以上是生活随笔為你收集整理的Spring事务配置实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP】NLP文本分类落地实战五大利器
- 下一篇: 【职场】遇到了个失业开滴滴的程序员