@Service
public class EmpService {
@Transactional
public final void add(UserModel userModel){
saveData(userModel);
}
}
因为 Spring 事务底层是用了 AOP ,用了JDK的动态代理或者CGLB的动态代理,会帮我们生成代理类,在代理类中实现事务功能。如果某个方法被final修饰了,那么在代理类中,就无法重新该方法,而添加事务功能。
注意:如果某个方法被static修饰,同样也无法通过动态代理,变成事务方法。
3. 直接调用内部方法
java复制代码
@Service
public class EmpService {
public void add(UserModel userModel){
saveData(userModel);
updateSataus(userModel);
}
@Transactional
public void updateSataus(UserModel userModel){
doSomething();
}
}
在事务方法add可知,它直接调用了 updateStatus 方法,方法拥有事务的能力是因为 Spring AOP 中生成了代理对象,但是直接调用 updateStatus 方法不会直接生成事务。但是可以直接将该类直接注入进来,比如:
java复制代码
@Service
public class EmpService {
private EmpService empService;
@Transactional
public void add(UserModel userModel){
saveData(userModel);
empService.updateSataus(userModel);
}
@Transactional(rollbackFor = Exception.class)
public void updateSataus(UserModel userModel){
doSomething();
}
}
这样事务就生效了,也不会穿生循环依赖的问题。
4. 未被 Spring 管理
如下所示:EmpService 类没有交给 Spring 进行管理(没添加**@Service**等注解),导致事务失效。
java复制代码
public class EmpService {
@Transactional
public void add(UserModel userModel){
saveData(userModel);
updateSataus(userModel);
}
}
@Service
public class EmpService {
@Autowired
private OrderService orderService;
@Transactional
public void add(UserModel userModel){
new Thread(()->{
orderService.updateSataus();
}).start();
}
}
@Service
public class OrderService{
@Transactional
public void updateSataus(){
System.out.println("======================");
}
}