spring事务失效场景
添加@Transactional后的方法,不会直接操作数据库,例如保存方法,在执行完保存语句后,数据库并没有出现该数据,只有方法结束之后,才会正式保存到数据库。
1、首先使用如下代码 确认你的bean 是代理对象吗?
必须是Spring定义(通过XML或注解定义都可以)的Bean才接受事务。
直接new出来的对象添加事务是不起作用的。
可以通过以下方式判断是否是代理对象:
AopUtils.isAopProxy(Object object)
AopUtils.isCglibProxy(Object object) //cglib
AopUtils.isJdkDynamicProxy(Object object) //jdk动态代理;
2、如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB;
3、@Transactional 注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,事务也会失效。这一点由Spring的AOP特性决定的;
4、如果你使用了springmvc,可能是context:component-scan重复扫描引起的;
5、如果调用的方法没加@Transactional,那么被调用的方法家了@Transactional,也不会回滚
@Service
public class BizServiceImpl implements BizService {
//@Transactional 如果这里没有加事务,那么抛出异常后,保存方法不会回滚
public void save(Order order) {
saveOrder(order);//调用了当前类的方法
throw new NullPointerException();
}
@Transactional
public void saveOrder(Order order) {
// save order
throw new NullPointerException();//保存方法内部的异常也不会回滚
}
}
6、异常类型错误,默认是runtimeException才会回滚的;
throw new RuntimeException(“xxxxxxxxxxxx”); 事务回滚
throw new Exception(“xxxxxxxxxxxx”); 事务没有回滚
7、异常被catch住,忘记抛出,记住必须抛异常才会回滚的.
来源:CSDN
作者:半根辣条
链接:https://blog.csdn.net/weixin_44236420/article/details/103937015