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 事物系列(四) 事物在多数据源环境下的改造