Spring事务管理

来源:互联网 发布:珀莱雅淘宝店真假 编辑:程序博客网 时间:2024/06/03 17:53

1.使用场景:假设有两张表A和B,现在做关联插入操作,当插入到B表发生错误时,要求A表的插入操作回滚

2.实现方法

方法一:使用注解@Transactionnal 

方法二:不使用注解,spring配置某个方法进行事务管理(通过aop配置)

3.注解方法实现:

(1)spring配置

//配置事务管理器,DataSourceTransactionManager中有提交和回滚等一些列方法,进行事务管理

<bean id="transactionManager"     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   //数据源,数据库配置   <property name="dataSource" ref="smartDataSource" /></bean>
//使注解生效

<tx:annotation-driven transaction-manager="transactionManager"/>
(2)在需要使用事务管理的方法上加上注解,该注解有很多参数,大家可以baidu一下看看

@Transactional(rollbackFor=YourException.class)

public void myMethod(){

try{

insert(A); //插入A表

        //int a=1/0;//测试

insert(B);//插入B表

}catch(Exception e){

throw new YourException();

        }

}

说明:YourException 必须继承自unchecked类异常,例如RuntimeException;方法必须是public的;所有操作都执行完毕后,若没有异常再进行插入操作,若有异常,进行回滚

4.不使用注解,直接在spring配置文件中通过aop配置

//必须的配置文件同上

//配置事务管理器,DataSourceTransactionManager中有提交和回滚等一些列方法,进行事务管理

<bean id="transactionManager"     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   //数据源,数据库配置   <property name="dataSource" ref="smartDataSource" /></bean>

//配置某个方法使用事务管理,这个对应使用注解方式方法和一些参数配置

<tx:advice id="txAdvice" transaction-manager="transactionManager">   <tx:attributes>      <tx:method name="myMethod" isolation="DEFAULT" propagation="REQUIRED" rollback-for="YourException"/>   </tx:attributes></tx:advice>
//aop配置,因为你的某个需要事务管理的方法,根据业务需要在某个类服务里面,所以aop配置某个服务类为切入点,大家可以再仔细baidu一下aop相关知识
<aop:config>   <aop:pointcut id="myService" expression="execution(* *..service.*.*(..))"/>   <aop:advisor advice-ref="txAdvice" pointcut-ref="myService"/></aop:config>
5.总结 看事务有没有生效,可以进入DataSourceTransActionManager类中再doBegain、doCommit、doRollback等方法中打断点,看一下有没有执行
根据上面的配置应该够用了,但是有可能会碰到注解不生效的情况,这时候要么查一下不生效的原因(可能是父子上下文的原因),要么直接用aop配置,
但是配置比较麻烦。

原创粉丝点击