1. 程式人生 > >關於宣告式事務管理和註解事務

關於宣告式事務管理和註解事務

在javaweb操作中,當涉及到資料庫的持久化操作的時候就有一個大人物需要提起:事務


1,在原始的開發中事務可以通過在spring中配置進行操作,基本的原理就是,在spring中加入相應的sessionfactory(不同
的持久化框架不一樣,mybatis為sqlsessionfactory,hibernate為sessionfactory)然後依賴各個持久化層的提供的事務管
理器(依賴配置好的資料來源)通過spring的aop配置,為service層新增事務(其實就是隱士的加了一些操作,在service方法
前將sessionfactory注入並開啟事務,在service方法結束的時候關閉事務,發生錯誤回滾事務而已)
例子:以ssm開發為例:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
<property name="dataSource" ref="datasource"></property>
</bean>

<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="maxPoolSize" value="${jdbc.pool.max}"></property>
<property name="initialPoolSize" value="${jdbc.pool.init}"></property>
<property name="acquireIncrement" value="${jdbc.pool.add}"></property>
</bean>
<!-- 事物管理器
     對mybatis操作資料庫事務控制spring使用jdbc的事務控制類
      -->    
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!-- 資料來源 datasource在applicationContext-dao.xml中配置了-->
          <property name="dataSource" ref="dataSource"></property>
      </bean>  
     <!-- 通知 -->
     <tx:advice id="txAdvice" transaction-manager="transactionManager">
     <tx:attributes>
     <!-- 傳播行為 -->
     <tx:method name="save*" propagation="REQUIRED"/>
     <tx:method name="delete*" propagation="REQUIRED"/>
     <tx:method name="insert*" propagation="REQUIRED"/>
     <tx:method name="update*" propagation="REQUIRED"/>
     <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
     <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
     <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
     </tx:attributes>
     </tx:advice>
     <!-- aop -->
     
     
     <aop:config>
     <!-- 定義切入點     advice-ref定義切入點所要加入的通知  -->
     <!-- 通知加在cn.edu.ssm.serviceimpl包下所有類的所有方法(任意引數) -->
     <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.edu.service.*.*(..))"/>
     </aop:config>
      
2,另一種關於事務的操作就是(因為是註解開發)開啟註解事務在service層(需要進行事務控制的地方)通過註解的方式
新增事務操作
例子:以ssh為例:
<bean id="sessionFactory"   
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
    <property name="dataSource" ref="dataSource" />  
    <property name="annotatedClasses">  
        <list>  
            <value>Spitter.spitterOne.Spitter</value>  
        </list>  
    </property>  
  
    <property name="hibernateProperties">  
        <props>  
            <prop key="dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>  
            <prop key="hibernate.show_sql">true</prop>  
            <prop key="hibernate.format_sql">true</prop>  
            <prop key="hibernate.hbm2ddl.auto">update</prop>  
              
        </props>  
    </property>  
      
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >  
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    <property name="url" value="jdbc:mysql://localhost:3306/spitter" />  
    <property name="username" value="root" />  
    <property name="password" value="root" />  
    <property name="initialSize" value="5"/>  
    <property name="maxActive" value="10" />  
</bean> 

<!-- 設定transactionManager -->    
    <bean id="txManager"    
       class="org.springframework.orm.hibernate3.HibernateTransactionManager">    
       <property name="sessionFactory" ref="sessionFactory" />    
    </bean>    
   
   <!--啟動spring事務註解功能-->    
   <tx:annotation-driven transaction-manager="txManager"/>  

3,總之,上面的兩種操作,都可以達到事務管理,各有利弊,第一種配置麻煩,而且控制事務是統籌性質的,不能夠做到
對於具體操作實行特定事物,而第二種可以彌補第一種的缺點,但是他的缺點是每一個方法都需要進行註解,比較麻煩