[原创]Spring: A Developer's Notebook笔记和小结(20)

来源:互联网 发布:网络舆情监测专业待遇 编辑:程序博客网 时间:2024/05/16 01:12
/**
作者:Willpower
来源:Rifoo Technology(
http://www.rifoo.com
时间:2006-03-26
备注:转载请保留以上声明
**/

本节主要讨论声明式事务,如何去配置一个简单的事务。

目前,我们都知道声明式事务式目前使用最多的事务类型。现在我们回顾并解释一下处理我们facade类的事务。在讲JDBC的那一章节里,我们配置了事务但并没有对它做任何解释性说明,那么现在我们来填补这个空。

声明式事务可能式EJB的会话bean(session beans)里用到的最有用的特征。当许多开发者发现实际上只需要使用声明式事务就可完成那么多功能,而不用花那么大代价时,他们就决定根本不去使用EJB了。

我们可以不用去接触任何编码的情况下去实现声明式事务。我们仅仅需要做的是改变上下文。就像前面介绍的内容中一样,我们要配置一个拦截器(interceptor)。这个拦截器定义了需要事务处理的方法,和它们期望的行为。一些方法会使用到完全事务传播(full transaction propagation),一些方法使用到轻量,只读传播(lighter-weight, read-only propagation)。

Example 7-3. RentABike-servlet.xml
<bean name="transactionInterceptor" class="org.springframework.
transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager">
        <ref local="transactionManager"/>
    </property>
    <property name="transactionAttributeSource">
        <value>          
       
com.springbook.RentABike.transferReservation=
        PROPAGATION_REQUIRED,-ReservationTransferException
        com.springbook.RentABike.save*=PROPAGATION_REQUIRED
        com.springbook.RentABike.*=PROPAGATION_REQUIRED,readOnly

        </value>
    </property>
  </bean>


我们注意红色的地方,在transferReservation方法的行为定义里,我们传进了一个必需的事务标志(transaction flag)和一个checked exception。这个是告诉拦截器如果有这种类型的异常被抛出时,将自动回滚该事务。否则不回滚。

接着,我们创建一个代理来指定一个目标bean:

Example 7-4. RentABike-servlet.xml
<bean id="rentaBike" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
    <value>com.springbook.RentABike</value>
    </property>
    <property name="interceptorNames">
      <value>transactionInterceptor,rentaBikeTarget</value>
    </property>
</bean>


执行结果没有变。

小结:
我们刚刚为一个POJO配置了声明式事务。当我们指定的任何一个方法开始时,事务通告(transaction advisor)会告诉优先的事务策略来开始事务。当方法成功完成时,advisor会提交整个事务。如果出现异常,advisor不会回滚。

Java Transaction API或者直接说是JTA?到目前为止,我们使用了轻量级的事务。Spring有一个很好的功能就是可以改变事务策略而不用重编写任何代码。Spring完全支持JTA,因此我们可以使用它来扩展到多个不同的数据库或者执行分布式事务(XA transactions)。
原创粉丝点击