spring 事物系列(一) 事物的基本使用

一、使用方法

1、通过在xml中进行配置

//注入事物管理器  
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="dataSource"/>
</bean>

//通过spring的驱动解析标签,将事物后置处理器加入到beanPostProcessor列表中去,
//这样后续spring容器对bean完成初始化后,则会调用该事物后置处理器,
//该事物管理器则会判断bean所包含的方法或方法所在的类是否符合事物拦截的特征,
//然后会将驱动一并注入的事物advisor包装到bean中去,返回一个被事物代理过的bean。
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

 

2、通过在方法上加@Transaction,对方法进行拦截处理。

这样被拦截的方法则被TransactionIncepter所包装,伪代码如下所示
try{
  methodInvocation.invoke();
}
catch(RunException e){
  roolback();
}
finally{
  releaseResource();
}
commit();

 

二、使用注意项

1、被代理的方法必须是public,除非在注册事物拦截器时指定可以使用非public的方法修饰符。

2、调用被@Transaction装饰的方法时,不能是方法内部的调用,必须是被spring管理的对象来调用这个方法。

如下所示,调用b方法时,是直接走的Test这个对象的方法的引用,而不是被spring管理生成的代理类Test#Proxy的引用,导致事物拦截器没有执行的挂载点。

@Componet
public class Test{

  public void a(){
     b.();
  }

  @Transaction
  public void b(){
     insert();
     update();
  }

}

这种情况,可以通过1、将b方法写到其他注入bean中去。2、通过spring容器获取这个Test类的bean,然后进行调用。 

 

spring 事物系列

spring 事物系列(一) 事物的基本使用

spring 事物系列(二) 事物的进阶使用

spring 事物系列(三) 事物的原理及源码分析

spring 事物系列(四) 事物在多数据源环境下的改造

 

posted @ 2020-08-24 11:54  panda521  阅读(195)  评论(0编辑  收藏  举报