Spring的事务配置有两种:1、基于注解;2、基于XML文件
一、基于注解
配置流程:
1、Spring配置文件配置需要加入:
<!-- 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" /><!-- ref:引入数据源 -->
</bean>
<!-- 启动事物注解 transaction-manager的值必须和上面这个bean的id一样-->
<tx:annotation-driven transaction-manager="transactionManager"/>
2、在需要使用事务的方法上面加入@Transactional注解。
@Transactional注解的属性:
1)事物的传播行为:propagation,即当前事物方法被另一个事物方法调用时如何使用事物,默认取值为REQUIRED,即使用调用的方法的事物。
2)事物的隔离级别:isolation:指定事务的隔离级别,最常用的取值为:READ_COMMITTED,读以提交。
3)事务回滚:
(1)noRollbackFor、noRollbackForClassName:对这个异常不进行回滚 通常情况下取默认值即可。
(2)rollbackFor、rollbackForClassName:对这个异常进行回滚 通常情况下取默认值即可。
4)只读事务:readOnly,只能读取数据,可以帮助数据库引擎优化。如果是只读,应设置:readOnly=true
5)强制回滚时间:timeout:指定强制回滚的时间,单位秒,如该方法执行了5秒,而该属性设置的是2秒,如果到2秒了,该方法还没有执行完,该事务也会对该方法进行强制回滚。
写法如下:
/**
* 事物注解
* 使用propagation 指定事物的传播行为,即当前事物方法被另一个事物方法调用时如何使用事物,默认取值为REQUIRED,即使用调用方法的事物
* REQUIRES_NEW:使用自己的事物,调用的事物方法的事物被挂起。
* isolation:指定事务的隔离级别, 最常用的取值为:READ_COMMITTED,读以提交
* noRollbackFor:对这个异常不进行回滚 通常情况下取默认值即可。
* rollbackFor:对这个异常进行回滚
* readOnly:只读事务,只能读取数据,可以帮助数据库引擎优化。如果是只读,应设置:readOnly=true
* timeout:指定强制回滚的时间,单位秒,如该方法执行了5秒,而该属性设置的是2秒,如果到2秒了,该方法还没有执行完,该事务也会对该方法进行强制回滚。
*/
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,
noRollbackFor={UserException.class},noRollbackForClassName="UserException",
rollbackFor={UserException.class},rollbackForClassName="UserException",
readOnly=false,timeout=100)
public void updatUser(){
System.out.println("需要用到事务的方法");
}
而通常情况是,使用事物,不需要设置@Transactional注解的属性,直接把它写在方法上面就可以了。
二、基于xml文件
1、只需要在Spring配置文件中进行一下配置就可以了。
<!-- 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" /><!-- ref:引入数据源 -->
</bean>
<!-- 配置事务属性,transaction-manager的值必须和上面这个bean的id一样 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 根据方法名指定事务属性 -->
<tx:method name="updatUser"
propagation="REQUIRED" isolation="READ_COMMITTED"
no-rollback-for="UserException.class" read-only="false"
rollback-for="UserException.class" timeout="5"/><!-- updatUser:对该方法进行事物的属性配置 -->
<tx:method name="*"/><!-- 代表所有方法,所有的事物取默认配置 -->
<tx:method name="get*" read-only="true"/><!-- 可以使用通配符的写法,所有使用get开头的方法,它的事务都是只做查询 -->
</tx:attributes>
</tx:advice>
<!-- 配置事务切入点,以及把事务切入点和事务属性关联在一起 -->
<aop:config>
<!-- 事务的切入点,execution切入点表达式 -->
<aop:pointcut expression="execution(* com.qw.service.impl.*.*(..))" id="txPointcut"/>
<!-- 使用aop,让事务属性和事务切入点关联 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>