Spring3的Transaction事務的傳播特性和隔離級別

網上百度複製的,有點亂,下面是事物傳播特性和隔離級別的配置,之前分開看一直疑惑,估作此搬運html

事物的傳播特性spring

來自:http://blog.163.com/girl_lihuiyue@126/blog/static/180696212013112345629678/數據庫

  • 首先在/WEB-INF/applicationContext.xml添加如下內容:
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
   <property name="sessionFactory"> 
       <ref bean="mySessionFactory"/> 
   </property> 
</bean> 

注:這是做爲公共使用的事務管理器Bean。這個會是事先配置好的,不需各個模塊各自去配。express

  • 下面就開始配置各個模塊所必須的部分,在各自的applicationContext-XXX-beans.xml配置的對於事務管理的詳細信息。

首先就是配置事務的傳播特性,以下:session

<!--  配置事務傳播特性 -->
<tx:advice id="TestAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
      <tx:method name="save*" propagation="REQUIRED"/> 
      <tx:method name="del*" propagation="REQUIRED"/> 
      <tx:method name="update*" propagation="REQUIRED"/> 
      <tx:method name="add*" propagation="REQUIRED"/> 
      <tx:method name="find*" propagation="REQUIRED"/> 
      <tx:method name="get*" propagation="REQUIRED"/> 
      <tx:method name="apply*" propagation="REQUIRED"/> 
    </tx:attributes> 
</tx:advice> 
<!--  配置參與事務的類 -->
<aop:config> 
<aop:pointcut id="allTestServiceMethod" expression="execution(* com.test.testAda.test.model.service.*.*(..))"/> 
<aop:advisor pointcut-ref="allTestServiceMethod" advice-ref="TestAdvice" /> 
</aop:config>

須要注意的地方:app

(1) advice(建議)的命名:因爲每一個模塊都會有本身的Advice,因此在命名上須要做出規範,初步的構想就是模塊名+Advice(只是一種命名規範)。框架

(2) tx:attribute標籤所配置的是做爲事務的方法的命名類型post

         如<tx:method name="save*" propagation="REQUIRED"/>ui

        其中*爲通配符,即表明以save爲開頭的全部方法,即表示符合此命名規則的方法做爲一個事務。url

        propagation="REQUIRED"表明支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。

(3) aop:pointcut標籤配置參與事務的類,因爲是在Service中進行數據庫業務操做,配的應該是包含那些做爲事務的方法的Service類。

       首先應該特別注意的是id的命名,一樣因爲每一個模塊都有本身事務切面,因此我以爲初步的命名規則由於 all+模塊名+ServiceMethod。並且每一個模塊之間不一樣之處還在於如下一句:

       expression="execution(* com.test.testAda.test.model.service.*.*(..))"

       其中第一個*表明返回值,第二*表明service下子包,第三個*表明方法名,「(..)」表明方法參數。

(4) aop:advisor標籤就是把上面咱們所配置的事務管理兩部分屬性整合起來做爲整個事務管理。

圖解:

image

隔離級別配置

來自:http://www.cnblogs.com/hoojo/archive/2011/04/15/2017447.html

MyBatis3整合Spring3的Transaction事務處理

      正如第二版,Spring 僅支持 iBatis2。那麼咱們就想將 MyBatis3 的支持加入到 Spring3.0(參考 Spring 的 Jira 的問題)中。

不幸的是,Spring 3.0 的開發在 MyBatis 3.0 官方發佈前就結束了。由於Spring開發團隊不想發佈一個基於非發行版的MyBatis的整合支持,

那麼 Spring官方的支持就不得不等到至少 3.1 版本了。要在 Spring 中支持 MyBatis,MyBatis 社區認爲如今應該是本身團結貢獻者和有興趣的人

一塊兒來開始進行 Spring 和 MyBatis 整合的時候了。 這個小類庫就來建立丟失的粘貼 Spring 和 MyBtatis 這兩個流行框架的膠水。

減小用戶不得不來配置MyBatis和Spring 3.X上下文環境的樣板和冗餘代碼。 它還透明地增長了 Spring對 MyBatis 事務的支持。

      因此儘管MyBatis3提供了對Spring的整合,可是org.springframework.jdbc.datasource.DataSourceTransactionManager這個事務管理器仍是不支持

aop的事務管理方式,若是你還想設置你的事務的隔離級別、只讀(PROPAGATION_REQUIRED、ISOLATION_DEFAULT、readOnly、timeout)。

那麼你可使用org.springframework.transaction.interceptor.TransactionProxyFactoryBean這個事務攔截器的代理工廠。它仍是能夠完成的,可是固然不會

有HibernateTransactionManager那樣的完美,由於DataSourceTransactionManager不能使用aop來管理咱們的事務。

基本配置以下:

<!-- 配置事務管理器,注意這裏的dataSource和SqlSessionFactoryBean的dataSource要一致,否則事務就沒有做用了 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
 
<!-- 配置事務的傳播特性 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
        <props>
            <prop key="add*">PROPAGATION_REQUIRED</prop>
            <prop key="edit*">PROPAGATION_REQUIRED</prop>
            <prop key="remove*">PROPAGATION_REQUIRED</prop>
            <prop key="insert*">PROPAGATION_REQUIRED</prop>
            <prop key="update*">PROPAGATION_REQUIRED</prop>
            <prop key="del*">PROPAGATION_REQUIRED</prop>
            <prop key="*">readOnly</prop>
        </props>
    </property>
</bean>

而後,你須要配置的是對那個類的進行攔截器事務管理,就就須要設置這個接口的parent屬性爲baseTransactionProxy,target是該接口的實現類。以下:

<!-- 爲AccountBiz接口配置事務攔截器,baseTransactionProxy是事務攔截器,在Controller中獲取這個對象 -->
<bean id="accountBiz" parent="baseTransactionProxy">
    <!-- 設置target,也就是AccountBiz的實現類 -->
    <property name="target" ref="accountBizImpl"/>
</bean>

上面的accountBiz是一個接口,它的實現類的id是accountBizImpl。而後你在Struts或SpringMVC中注入accountBiz這個接口便可使用裏面的方法了。

糟糕的是,你須要爲全部須要事務管理的類或接口都要進行這個配置!也許你能夠配置一個BaseBiz的parent是baseTransactionProxy,而後全部要進行

事務管理的接口或類,繼承或實現BaseBiz這個接口。不妨能夠嘗試一番!

相關文章
相關標籤/搜索