Spring支持编程式事务策略和声明式事务策略,但是通常都推荐使用声明式事务策略;
使用声明式事务策略的优势很明显:
1、声明式事务能大大降低开发者的代码书写量,无论底层事务策略如何变化,应用程序都无需改变
2、Spring声明式事务管理无需容器的支持,可以在任何环境下使用
3、通过配置文件,Spring可以指定事务在遇到特定异常时自动回滚
4、Spring采用AOP的方式管理事务
Spring2.x的XML Schema方式提供了讲解的事务配置策略,使用tx:命名空间来配置事务管理,tx:命名空间下提供了<tx:advice.../>元素来配置事务的增强处理,一旦使用该元素配置了事务增强处理,就可以直接使用<aop:advisor.../>元素启动自动代理了
<tx:advice.../>元素除了需要transaction-manager属性指定事务管理器之外,还需要配置一个<tx:attributes.../>子元素,该子元素里又可包含多个<tx:method.../>子元素,每个<tx:method.../>子元素都为一批方法指定了所需要的事务定义,包括事务的传播属性、事务的隔离属性、事务超时属性、只读事务、对指定异常回滚、对指定异常不回滚等。
<tx:method.../>可以指定如下几个属性:
name:必填属性,与该事务相关联的方法名,支持通配符,eg:'get*','on*Event';
propagation:指定事务的传播行为,默认为Propagation.REQUIRED;
isolation:事务的隔离级别,默认为Isonlation.DEFAULT;
timeout:指定事务超时的时间,单位是秒,指定-1表示不超时,默认值为-1;
read-only:指定事务是否只读,该属性默认为false;
rollback-for:指定触发事务回滚的异常类(要使用全限定类名),该属性可以指定多个异常类,异常类之间用英文逗号隔开;
no-rollback-for:指定不触发事务回滚的异常类(要使用全限定类名),可以指定多个异常,用英文逗号隔开。
<!--配置JDBC数据源的事务管理器,使用DataSourceTransactionManager类-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务增强处理bean,并指定事务管理器-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" rollback-for="exception.NoItemException"
no-rollback-for="exception.AuctionException"/><!--所有以get开头的方法都是只读的-->
<tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="5"/>
</tx:attributes>
</tx:advice>
<!--AOP配置的元素-->
<aop:config>
<!--配置一个切入点--></span>
<aop:pointcut id="myPointcut" expression="execution(* com.whj.springDemo.service.*.*(..))"/>
<!--指定在myPointcut切入点应用txAdvice事务增强处理--></span>
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>
<!--配置JDBC数据源的事务管理器,使用DataSourceTransactionManager类-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务增强处理bean,并指定事务管理器-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" rollback-for="exception.NoItemException"
no-rollback-for="exception.AuctionException"/><!--所有以get开头的方法都是只读的-->
<tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="5"/>
</tx:attributes>
</tx:advice>
<!--AOP配置的元素-->
<aop:config>
<!--配置一个切入点--></span>
<aop:pointcut id="myPointcut" expression="execution(* com.whj.springDemo.service.*.*(..))"/>
<!--指定在myPointcut切入点应用txAdvice事务增强处理--></span>
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>