Spring事务面试题

事务面试题

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.事务分类

  • 编码事务:硬编码实现事务,在需要事务的代码中手动开启事务,事务结束回滚或者提交。

  • 声明式事务:基于Spring AOP,通过切面完成事务管理。可以通过Xml定义切点、切面、通知等。也可以在需要事务的方法通过注解@Transactional完成。

编程式事务简单eg:

@Autowired
    private TransactionTemplate transactionTemplate;

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

            }

        });

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

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