1. 程式人生 > >Spring配置事務中的 transactionAttributes 各屬性含義及XML配置

Spring配置事務中的 transactionAttributes 各屬性含義及XML配置

               

transactionAttributes 屬性:

PROPAGATION

事務傳播行為型別

說明

PROPAGATION_REQUIRED

如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

PROPAGATION_SUPPORTS

支援當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY

使用當前的事務,如果當前沒有事務,就丟擲異常。

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

以非事務方式執行,如果當前存在事務,則丟擲異常。

PROPAGATION_NESTED

如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。


Exception:(註解用 rollback-for) 定義當遇到Exception異常 時 回滾。

檢視文字列印?
  1. <propkey="save*">PROPAGATION_REQUIRED,-ApplicationException,+BusinessException</prop>

- 表示丟擲該異常時需要回滾

+表示即使丟擲該異常事務同樣要提交

-ApplicationException :表示丟擲ApplicationException 時,事務需要回滾。但不是說只丟擲ApplicationException 異常時,事務才回滾,如果程式丟擲RuntimeException和Error時,事務一樣會回滾,即使這裡沒有配置。因為Spring中預設對所有的RuntimeException和Error都會回滾事務


readonly :

readonly是設定操作許可權為只讀,一般用於查詢的方法,優化作用.

註解形式:

<context:annotation-config />      <context:component-scan
base-package="com.bluesky" />
        <tx:annotation-driven transaction-manager="transactionManager"/>        <bean id="sessionFactory"                class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">            <property name="configLocation" value="classpath:hibernate.cfg.xml" />            <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />      </bean>          <!-- 定義事務管理器(宣告式的事務) -->        <bean id="transactionManager"          class="org.springframework.orm.hibernate3.HibernateTransactionManager">          <property name="sessionFactory" ref="sessionFactory" />      </bean>        </beans> 

package com.bluesky.spring.dao;    import java.util.List;    import org.hibernate.SessionFactory;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  import org.springframework.stereotype.Component;    import com.bluesky.spring.domain.User;    @Transactional(value = "txManager",propagation=Propagation.REQUIRED,rollbackFor=Exception.class,readOnly=true)@Component("userDao"public class UserDaoImpl extends HibernateDaoSupport implements UserDao {        public List<User> listUsers() {          return this.getSession().createQuery("from User").list();      }              } 


aop形式:

<context:annotation-config />     <context:component-scan base-package="com.bluesky" />       <bean id="sessionFactory"               class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">           <property name="configLocation" value="classpath:hibernate.cfg.xml" />           <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />     </bean>         <!-- 定義事務管理器(宣告式的事務) -->       <bean id="transactionManager"         class="org.springframework.orm.hibernate3.HibernateTransactionManager">         <property name="sessionFactory" ref="sessionFactory" />     </bean>       <tx:advice id="txAdvice" transaction-manager="transactionManager">         <tx:attributes>             <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />         </tx:attributes>     </tx:advice>          <aop:config>         <aop:pointcut id="interceptorPointCuts"             expression="execution(* com.wonders.asset.service..*.*(..))" />       <aop:advisor advice-ref="txAdvice"             pointcut-ref="interceptorPointCuts" />             </aop:config>        </beans>  


共享基類:

<bean id="sessionFactory"                class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">            <property name="configLocation" value="classpath:hibernate.cfg.xml" />            <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />      </bean>          <!-- 定義事務管理器(宣告式的事務) -->        <bean id="transactionManager"          class="org.springframework.orm.hibernate3.HibernateTransactionManager">          <property name="sessionFactory" ref="sessionFactory" />      </bean>            <bean id="transactionBase"                class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"                lazy-init="true" abstract="true">            <!-- 配置事務管理器 -->            <property name="transactionManager" ref="transactionManager" />            <!-- 配置事務屬性 -->            <property name="transactionAttributes">                <props>                    <prop key="*">PROPAGATION_REQUIRED</prop>                </props>            </property>        </bean>               <!-- 配置DAO -->      <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">          <property name="sessionFactory" ref="sessionFactory" />      </bean>            <bean id="userDao" parent="transactionBase" >            <property name="target" ref="userDaoTarget" />         </bean>  </beans>