1 起因
目前大都采用了注解来配置数据库以及事物。最近接了一个很老的项目,用spring3实现的。项目连spring mvc都没有使用,直接自己实现的servlet。这样也好,再熟悉下tomcat的各个概念。
2 启用注解事物配置
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
lazy-init="true">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
如上,给DataSource配置了事物,并且开启了注解@Transanctional
3 完全xml配置
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
lazy-init="true">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"
read-only="false" />
<tx:method name="delete*" propagation="REQUIRED"
read-only="false" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethods"
expression="execution(* com.acctservice.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
execution() 第一个*,代表任意返回值。 接下来是包路径。 第二个是包路径下所有的类。 第三个是类下所有的方法。 (..)表示支持所有的参数。
4 注意
开始的时候,事物在异常抛出的时候,并没有回滚。 通过debug发现,事物的切面已经生效了。 后来发现,抛出的异常是继承了Exception。而让事物回滚的异常需要继承RuntimeException。