• spring面试——事务问题汇总


    背景:面试被问到一个提,说说事务失效的场景,答的很不好,所以平时还是加强总结,发散思维,多做准备。

    失效可能的原因

    Spring 事务失效的8大原因
    1、数据库引擎是否支持事务(Myisam不支持事务)
    2、注解所在的类是否被加载成Bean(对象没有被Spring管理)
    3、注解所在的方法是否为public修饰
    4、是否发生了自身调用问题
    5、所有数据源是否加载了事务管理器
    6、@transaction的propagation配置是否正确
    7、捕获了异常
    8、checked exceptions无效,需要配置rollbackFor = Throwable.class

    9、只读事务 只在

    Spring事务失效的 8 大原因,这次可以吊打面试官了!

    ps:交简单的说明了几种场景

    @Transactional注解事务不回滚不起作用无效

    ps通俗易懂

    java中异常的分类(事务只回滚unchecked异常)

    详解Java中的checked异常和unchecked异常

    java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,

    其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等

    ps:

    public class RuntimeException extends Exception
    public class Exception extends Throwable

    Exception中非RuntimeException的异常为checked 异常,编译会无法通过

    +-----------+
                     | Throwable |
                     +-----------+
                      /         
                     /           
              +-------+          +-----------+
              | Error |          | Exception |
              +-------+          +-----------+
               /  |             / |         
              \________/       \______/         
                                            +------------------+
              unchecked        checked      | RuntimeException |
                                            +------------------+
                                             /   |    |      
                                            \_________________/
                            
                                                unchecked

    辣么再通俗一点:你写代码出现的空指针等异常,会被回滚,文件读写,网络出问题,spring就没法回滚了。然后我教大家怎么记这个,因为很多同学容易弄混,你写代码的时候有些IOException我们的编译器是能够检测到的,说以叫checked异常,你写代码的时候空指针等死检测不到的,所以叫unchecked异常。这样是不是好记一些啦

    事务的传播机制理解

    CRUD更要知道的Spring事务传播机制

    ps:着重介绍了下面两个传播级别,结合例子很通俗易懂

    PROPAGATION_REQUIRED 

    PROPAGATION_REQUIRES_NEW

    案例二 PROPAGATION_REQUIRED 

    @Transactional
    @Override
    public void Example2(User user) {
        userMapper.insert(user);
        try {
            propagationService.required();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    // 另一个service
    @Transactional
    @Override
    public void required() {
        throw new NullPointerException("肥朝假装抛出了异常");
    }

    异常捕获,是否会插入数据呢?

    这个到底会不会插入数据呢?毕竟这个异常被try起来了。这个时候,正常的思维都会认为,能正常插入数据,但是答案是,不会插入数据,并且抛出异常

    org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

    ps:这里是因为A B共用一个事务,A中的事务,在B抛出异常时候,被标记为回滚。最好看原文

    案例二 PROPAGATION_REQUIRES_NEW

    @Transactional
    @Override
    public void Example3(User user) {
        userMapper.insert(user);
        try {
            propagationService.requiresNew();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void requiresNew() {
        throw new NullPointerException("肥朝假装抛出了异常");
    }

     答案是能插入数据

    事务传入机制的源码实现

    未完待续

    事务中的属性有哪些

  • 相关阅读:
    shell脚本while read line的使用
    shell 一次性赋值多个变量
    Docker Volume
    nginx反向代理与负载均衡
    lua中 table.getn(t) 、#t、 table.maxn(t) 这三个什么区别?
    pv绑定pvc
    使用brew services管理服务
    Kubernetes中强制删除Pod、namespace
    shell 中的${},##, %% , :- ,:+, ? 的使用
    petalinux中fsbl源码
  • 原文地址:https://www.cnblogs.com/lixuwu/p/14716474.html
Copyright © 2020-2023  润新知