Spring事务面试题

2019-07-19  本文已影响0人  sizuoyi00

事务面试题

1.什么情况导致事务失效

2.事务的传播行为

3.事务的隔离级别

详见文章:https://www.jianshu.com/p/9e7a80fbc73a

4.只在public方法上生效?

只有@Transactional 注解应用到 public 方法,才能进行事务管理。这是因为在使用 Spring AOP 代理时,Spring 在调用 TransactionInterceptor 在目标方法执行前后进行拦截之前,DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法会间接调用 AbstractFallbackTransactionAttributeSource(Spring 通过这个类获取表 1. @Transactional 注解的事务属性配置属性信息)的 computeTransactionAttribute 方法。

如果想在非public方法上生效,考虑使用AspectJ(织入方式)。

5.回滚规则

默认只把runtime, unchecked exceptions标记为回滚,即RuntimeException及其子类,Error默认也导致回滚。

6.事务注解在类/方法上

如果在接口、实现类或方法上都指定了@Transactional 注解,则优先级顺序为方法>实现类>接口;

建议只在实现类或实现类的方法上使用@Transactional,而不要在接口上使用,这是因为如果使用JDK代理机制(基于接口的代理)是没问题;

而使用使用CGLIB代理(继承)机制时就会遇到问题,因为其使用基于类的代理而不是接口,这是因为接口上的@Transactional注解是“不能继承的”;

7.事务分类

编程式事务简单eg:

@Autowired
    private TransactionTemplate transactionTemplate;

    public void test() {
        //无返回值
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            public void doInTransactionWithoutResult(TransactionStatus status) {

            }

        });

        //有返回值
        transactionTemplate.execute(new TransactionCallback<String>() {
            @Override
            public String doInTransaction(TransactionStatus status) {
                return null;
            }
        });
    }
上一篇 下一篇

猜你喜欢

热点阅读