问题描述
通常利用spring提供的注解@Transactional完成事务管理机制是如今最行之有效的方法。但当某方法调用同类其他方法时,即使被调用的方法添加注解仍会失效。
///未使用注解方法调用同类注解方法,注解失效!!!!
public class TransDemo{
public void editInfo(){
addInfo();
}
@Transactional
public void addInfo(){
addUser();
}
}
问题分析
首先要涉及到spring中@Transactional注解完成事务的基本原理:
spring 采用动态代理(AOP)在启动的时候会去实现对Bean的管理和切片,它为我们的每个class生成一个代理对象。
///spring生成的动态代理类(伪代码)
public class cgProxy{
TransDemo item=new TransDemo();
///有editInfo没有注解,动态代理类内方法主要为委托对象调用
public void editInfo(){
item.addInfo();
}
///由于addInfo方法有注解会在方法调用前后完成事务操作
public void addInfo(){
///新建事务
$trans.newInstance
///****切面*****
item.addUser();
///提交事务
$trans.commit
}
}
由上可看出editInfo方法内部调用addUser方法是不包含事务的,故注解失效
解决方法
尽量在不同类之间调用,只有在代理对象之间进行调用时,可以触发切面逻辑