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:对这个异常进行回滚 通常情况下取默认值即可。
扫描二维码关注公众号,回复:
45528 查看本文章
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>