在Spring中常用的事务传播行为
[list]
[*]PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
[*]PROPAGATION_SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。
[*]PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
[*]PROPAGATION_NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。
[*]PROPAGATION_NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常。
[/list]
另外还有PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW两种传播行为,不做介绍。
下面是基于xml的spring事务配置,使用拦截器来实现
配置Spring的事务管理器
定义Spring的事务拦截器TransactionInterceptor
定义要拦截的方法,这里用*表示拦截全部方法
定义拦截的类,这里拦截beanId以Service结尾的类(beanNames,对应xml中的beanId),在这个类中的所有数据库操作都会被视为一个事务
[list]
[*]PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
[*]PROPAGATION_SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。
[*]PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
[*]PROPAGATION_NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。
[*]PROPAGATION_NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常。
[/list]
另外还有PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW两种传播行为,不做介绍。
下面是基于xml的spring事务配置,使用拦截器来实现
配置Spring的事务管理器
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
定义Spring的事务拦截器TransactionInterceptor
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 依赖注入上面定义的事务管理器transactionManager -->
<property name="transactionManager" ref="transactionManager" />
<!-- 定义需要进行事务拦截的方法及所采用的事务控制类型 -->
<property name="transactionAttributes">
<props>
<!-- 所有方法均进行事务控制,如果当前没有事务,则新建一个事务 -->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
定义要拦截的方法,这里用*表示拦截全部方法
<bean id="trasactionMethodPointcutAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="mappedNames">
<list>
<value>*</value>
</list>
</property>
<property name="advice">
<ref local="transactionInterceptor"/>
</property>
</bean>
定义拦截的类,这里拦截beanId以Service结尾的类(beanNames,对应xml中的beanId),在这个类中的所有数据库操作都会被视为一个事务
<bean id="ServiceAutoProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass" value="true" />
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>trasactionMethodPointcutAdvisor</value>
</list>
</property>
</bean>