spring事务失效场景

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

你可能感兴趣的:(面试题)