spring事务失效场景

有些话、适合烂在心里 提交于 2020-01-11 17:30:29

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住,忘记抛出,记住必须抛异常才会回滚的.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!