随笔-109  评论-187  文章-25  trackbacks-0

    <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

         abstract="true">

       <property name="transactionManager" ref="transactionManager"/>

       <property name="transactionAttributes">

           <props>

              <prop key="insert*">PROPAGATION_REQUIRED</prop>

              <prop key="update*">PROPAGATION_REQUIRED</prop>

              <prop key="delete*">PROPAGATION_REQUIRED</prop>

              <prop key="change*">PROPAGATION_REQUIRED</prop>

              <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

           </props>

       </property>

    </bean>

1

一旦你决定要用 AOP 来做 SERVICE 内部每个方法的事务处理,那么在 DAO 层内部最好不要从自己去 catch 异常,因为在 SERVICE 里面可能多次调用 DAO ,一旦多次调用,你其中一个方法捕获了异常就没有办法保证事务回滚,所以即使你捕获异常为了调试,一定要在 CATCH 方法中一定还要抛出一个异常来,否则无法保证事务

 

2

一旦决定要用 spring aop 方式来处理事务,一定要不采用 JDOtemplate ,或者 HIBERNATE TEMPALATE 内部类的方式,因为那样他们自己去管理事务,一旦在内部类中事务回滚,无法保证其他的 DAO 中事务回滚

 

3

1、  PROPAGATION_REQUIRED -- 支持当前的事务,如果不存在就创建一个新的。这是最常用的选择。
2
PROPAGATION_SUPPORTS -- 支持当前的事务,如果不存在就不使用事务。
3
PROPAGATION_MANDATORY -- 支持当前的事务,如果不存在就抛出异常。
4
PROPAGATION_REQUIRES_NEW -- 创建一个新的事务,并暂停当前的事务(如果存在)。
5
PROPAGATION_NOT_SUPPORTED -- 不使用事务,并暂停当前的事务(如果存在)。
6
PROPAGATION_NEVER -- 不使用事务,如果当前存在事务就抛出异常。
7
PROPAGATION_NESTED -- 如果当前存在事务就作为嵌入事务执行,否则与 PROPAGATION_REQUIRED 类似。

 

 

4 < prop key="change*">PROPAGATION_REQUIRED</prop>

  你可以在 PROPAGATION_REQUIRE 之后指定抛出什么样的异常事务才回滚,或者事务的隔离方式是什么等等都可以配置如 <prop key="change*">PROPAGATION_REQUIRED,readOnly,-PetClinicException</prop>

posted on 2006-05-17 17:37 小小程序程序员混口饭吃 阅读(1281) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: