事务控制

    Author: 江南白衣

    暂时使用所有Sample通用的声明式事务控制体系,可以考虑JDK5.0的Annotation方式,但声明式体系下get*,find*的基类预定义比较节约代码。

    在声明式事务体系下,一般会定义一个baseTxService基类

<bean id="baseTxService"
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract="true">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="proxyTargetClass" value="true"/>
   <property name="transactionAttributes">
            <props>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

   Tips1 ,因为我们没有创建Service接口,不能用基于接口的Proxy方式,必须使用cgilib来实现AOP事务管理,且cglib的方式比Proxy方式效率略高,因此需定义:

<property name="proxyTargetClass" value="true"/>

   Tips2,当实际的Service子类需要事务控制的方法如--shipOrder,不为以上的get*,save*的命名方式时,需要在子类重新定义transactionAttributes。

   从Spring 2.0M2开始,beans支持default-merge= "true" 的定义,子类不需要重新定义get*,save*。

   可以在beans统一定义default-merge= true,也可以每个bean定义。

<beans default-merge="true"> 
<bean id="orderManager" parent="baseTxService">
        <property name="target">
            <bean class="org.springside.bookstore.service.OrderManager"/>
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="shipOrder">PROPAGATION_REQUIRED</prop>
            </props>
         </property>
    </bean>
</beans>