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:交简单的说明了几种场景

 

抛出所有异常都会回滚吗?_一口气说出 6种,@Transactional注解的失效场景,面试官都蒙了...

 

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

ps通俗易懂

 

 rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。

java中异常的分类

详解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("肥朝假装抛出了异常");
}
复制代码

 

 答案是能插入数据

 

 

 

事务传入机制的源码实现

未完待续

事务中的属性有哪些

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,让更多的人能够享受到获取知识的快乐!因为本人初入职场,鉴于自身阅历有限,所以本博客内容大部分来源于网络中已有知识的汇总,欢迎各位转载,评论,大家一起学习进步!如有侵权,请及时和我联系,切实维护您的权益!
posted @   CS408  阅读(1315)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
历史上的今天:
2019-04-29 (转)ReentrantLock实现原理及源码分析
点击右上角即可分享
微信分享提示