当前位置: 首页 > news >正文

Java事务失效(面试题)的常见场景

1. 方法非public修饰

原理: Spring AOP代理(CGLIB或JDK动态代理)默认无法拦截非public方法。

示例:

@Service
public class UserService {@Transactionalvoid updateUser() { // 非public方法// 事务不会生效!}
}

修复: 将方法改为public

2. 自调用(同一个类内部调用)

原理: 事务基于AOP代理,自调用绕过代理直接调用目标方法。
示例:

@Service
public class OrderService {public void placeOrder() {deductStock(); // 直接内部调用,事务失效}@Transactionalpublic void deductStock() {// 事务不生效!}
}

修复:

  • 从其他Bean注入自身(通过@Autowired注入代理对象)

  • 使用AopContext.currentProxy()(需开启exposeProxy

3. 异常类型错误或被捕获

场景1:抛出非RuntimeException/Error
原理: 默认只回滚RuntimeExceptionError
示例:

@Transactional
public void update() throws IOException {if (error) throw new IOException(); // 检查型异常,不回滚!
}

修复:
添加rollbackFor属性

@Transactional(rollbackFor = Exception.class)

场景2:异常被catch后未重新抛出
原理: 事务管理器检测不到异常。
示例:

@Transactional
public void update() {try {db.update(...); // 抛出SQLException} catch (Exception e) {// 捕获后不抛出,事务提交!}
}

修复: 在catch中抛出RuntimeException

catch (Exception e) {throw new RuntimeException(e);
}

4. 多线程环境下事务上下文丢失

原理: Spring事务信息存储在ThreadLocal中,新线程无法继承上下文。
示例:

@Transactional
public void asyncUpdate() {new Thread(() -> {userDao.update(); // 子线程操作无事务控制!}).start();
}

修复:
使用Spring的@Async + Transactional(需配置异步任务执行器)

@Async
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void asyncTask() {// 新事务生效
}

5. 数据库引擎不支持事务

原理: 如MySQL的MyISAM引擎不支持事务。
检查:

SHOW TABLE STATUS LIKE 'table_name'; -- 查看Engine类型

修复: 改用InnoDB引擎。

6. 嵌套事务传播配置错误

场景: 内层事务使用Propagation.NOT_SUPPORTED
示例:

@Transactional
public void outer() {inner();
}@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void inner() {// 挂起外层事务,操作无事务保护!
}

7. 非Spring管理Bean中使用@Transactional

原理: @Transactional由Spring代理实现。
错误示例:

public class Util {@Transactional // 未被Spring管理,注解无效public static void save() { ... }
}

相关文章:

  • Python 商务数据分析—— NumPy 学习笔记Ⅱ
  • 登录拦截功能实现 -瑞吉外卖笔记
  • 2025年EAAI SCI1区TOP,基于低差异序列的仿果蝇无人机地下环境路径规划算法,深度解析+性能实测
  • 群晖 NAS Docker 镜像加速配置详细教程
  • SpringBean 创建过程详解
  • 【ELK(Elasticsearch+Logstash+Kibana) 从零搭建实战记录:日志采集与可视化】
  • 预训练 vs. 微调:大模型落地的核心两步,究竟有何不同?
  • 【Linux手册】进程地址空间:从虚拟到物理的内存寻址之旅
  • 通义大模型在文档自动化处理中的高效部署指南(OCR集成与批量处理优化)
  • go excel解析库xuri/excelize中的SAX
  • 【PyTorch项目实战】CycleGAN:无需成对训练样本,支持跨领域图像风格迁移
  • 开关电源:BUCK和BOOST
  • NotePad++ 怎么没有找到插件管理?
  • C++ 友元:打破封装边界的“特殊权限”
  • LangChain赋能RAG:从构建到评估优化的一体化实战指南
  • 跨平台多路RTSP/RTMP转RTMP推送模块深度解析
  • Python函数实战:从基础到高级应用
  • ABP VNext + gRPC 双向流:实时数据推送与订阅场景实现
  • 量化-因子处理
  • 原创模板--微信小程序 实现的背单词程序
  • 网站排名优化外包公司/优化防疫政策
  • 网络推广公司排行榜/广告优化师
  • 太原搭建网站的公司哪家好/免费制作自己的网站
  • 网站建设竞品调研/网店代运营正规公司
  • 网站规划与建设类毕业论文怎么写/搜索引擎营销成功案例
  • 什么是网络营销网络营销的内容有哪些/长沙seo推广公司