MySQL 事务深度解析:面试核心知识点与实战
🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- Java 中 MySQL 事务深度解析:面试核心知识点与实战
- 一、事务基础概念
- 二、事务隔离级别详解(重点)
- 三、Spring 事务管理(高频考点)
- 四、事务失效场景与解决方案
- 五、分布式事务解决方案
- 六、事务优化实战技巧
- 七、高频面试题精析
- 八、生产环境最佳实践
- 总结:事务面试回答要点
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
Java 中 MySQL 事务深度解析:面试核心知识点与实战
事务是数据库系统的核心机制,也是 Java 面试的高频考点。本文从 ACID 原理到分布式事务,结合 Java 应用场景全面解析事务相关面试题。
一、事务基础概念
-
ACID 特性
特性 含义 实现机制 原子性 事务要么全执行,要么全不执行 Undo Log(回滚日志) 一致性 数据状态变化必须合法 应用层 + 数据库约束 隔离性 并发事务相互隔离 MVCC + 锁机制 持久性 提交后数据永久保存 Redo Log(重做日志) -
事务生命周期
二、事务隔离级别详解(重点)
-
并发问题与隔离级别对应关系
隔离级别 脏读 不可重复读 幻读 实现原理 READ UNCOMMITTED ✔ ✔ ✔ 无锁 READ COMMITTED ✘ ✔ ✔ 快照读(MVCC) REPEATABLE READ ✘ ✘ ✔ 一致性视图(默认级别) SERIALIZABLE ✘ ✘ ✘ 读写锁 -
Java 中设置隔离级别
// JDBC 设置 Connection conn = dataSource.getConnection(); conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);// Spring 声明式事务 @Transactional(isolation = Isolation.REPEATABLE_READ) public void transferMoney() {// ... }
三、Spring 事务管理(高频考点)
-
编程式事务 vs 声明式事务
// 编程式事务(TransactionTemplate) transactionTemplate.execute(status -> {accountDao.debit(fromAccount, amount);accountDao.credit(toAccount, amount);return null; });// 声明式事务(@Transactional) @Transactional public void transfer(Long from, Long to, BigDecimal amount) {accountDao.debit(from, amount);accountDao.credit(to, amount); }
-
事务传播机制(Propagation)
传播行为 含义 REQUIRED 有事务则加入,无则新建(默认) REQUIRES_NEW 总是新建事务,原事务挂起 NESTED 嵌套事务(MySQL 通过保存点实现) SUPPORTS 有事务则加入,无则非事务执行 NOT_SUPPORTED 非事务执行,挂起当前事务 典型场景:
@Transactional public void orderProcess() {// 主事务orderService.createOrder();// 需要独立事务(即使外部失败,日志必须记录)logService.saveLog(LogType.ORDER_ACTION, Propagation.REQUIRES_NEW); }
四、事务失效场景与解决方案
-
常见失效原因
- 方法非
public
(Spring AOP 限制) - 自调用问题(类内部方法调用)
- 异常类型错误(默认只回滚
RuntimeException
) - 数据库引擎不支持(如 MyISAM)
- 方法非
-
自调用问题解决方案
// 错误:内部调用事务失效 public void process() {saveOrder(); // 事务不生效 }@Transactional public void saveOrder() { /* ... */ }// 方案1:拆分类 @Service public class OrderService {@Autowiredprivate TransactionalService transactionalService;public void process() {transactionalService.saveOrder();} }// 方案2:AopContext(需开启 expose-proxy) ((OrderService) AopContext.currentProxy()).saveOrder();
五、分布式事务解决方案
-
主流方案对比
方案 一致性 性能 复杂度 适用场景 2PC 强一致 低 中 跨库事务 TCC 强一致 中 高 金融支付 本地消息表 最终一致 高 低 异步通知 Seata AT 弱一致 较高 低 微服务场景 -
Seata AT 模式示例
// 全局事务注解 @GlobalTransactional public void placeOrder(Order order) {// 1. 扣减库存storageService.deduct(order.getProductId(), order.getCount());// 2. 创建订单orderDao.create(order);// 3. 扣减余额accountService.debit(order.getUserId(), order.getMoney()); }
执行流程:
- 业务 SQL 被解析成 UNDO_LOG
- 注册分支事务到 TC(事务协调器)
- 提交时异步删除 UNDO_LOG
- 失败时根据 UNDO_LOG 反向补偿
六、事务优化实战技巧
-
长事务优化方案
// 方案1:拆分大事务 @Transactional public void batchProcess() {// 错误:10万条数据处理在一个事务for (Data data : dataList) {processSingle(data);} }// 优化:分批次提交 int batchSize = 1000; for (int i = 0; i < total; i += batchSize) {List<Data> subList = dataList.subList(i, Math.min(i + batchSize, total));transactionTemplate.execute(status -> {subList.forEach(this::processSingle);return null;}); }
-
死锁避免策略
- 统一资源访问顺序(如按 id 排序)
- 锁超时设置:
innodb_lock_wait_timeout=50
- 尽量使用索引减少锁范围
-
监控与诊断
-- 查看当前事务 SELECT * FROM information_schema.INNODB_TRX;-- 查看锁等待 SELECT * FROM performance_schema.data_lock_waits;-- 查看死锁日志 SHOW ENGINE INNODB STATUS;
七、高频面试题精析
-
MVCC 如何实现可重复读?
InnoDB 为每个事务分配 ReadView,包含:
- 当前活跃事务 ID 列表
- 最小事务 ID(up_limit_id)
- 下一个事务 ID(low_limit_id)
读取时根据数据行的 DB_TRX_ID 判断可见性
-
Redo Log 和 Binlog 区别?
特性 Redo Log Binlog 作用 崩溃恢复 主从复制 + 数据恢复 写入方式 顺序追加 事务提交后顺序写入 存储内容 物理日志(页修改) 逻辑日志(SQL 语句) 所在层级 InnoDB 引擎层 MySQL Server 层 -
Spring 事务何时回滚?
默认对
RuntimeException
和Error
回滚,可通过注解配置:@Transactional(rollbackFor = Exception.class, // 所有异常回滚noRollbackFor = BusinessException.class) // 业务异常不回滚
八、生产环境最佳实践
-
事务配置模板
@Bean public TransactionTemplate transactionTemplate(PlatformTransactionManager txManager) {TransactionTemplate template = new TransactionTemplate(txManager);template.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);template.setTimeout(30); // 30秒超时template.setReadOnly(false);return template; }
-
连接池关键配置
spring:datasource:hikari:maximum-pool-size: 20connection-timeout: 3000max-lifetime: 1800000leak-detection-threshold: 5000 # 连接泄漏检测
-
分布式事务选型指南
场景 推荐方案 框架支持 跨库操作 Seata AT Seata 资金交易 TCC ByteTCC, Seata TCC 异步通知 本地消息表 RocketMQ, Kafka 长流程业务 Saga ServiceComb Saga
总结:事务面试回答要点
-
基础必答
“ACID 是事务的四个基本特性,MySQL 默认隔离级别是 RR(可重复读),通过 MVCC 和间隙锁实现”
-
Spring 事务
“Spring 通过 AOP 代理实现声明式事务,传播机制解决业务嵌套问题,REQUIRED 是默认策略”
-
深度优化
“长事务优化可通过拆分+编程式事务解决,分布式事务根据场景选型,Seata AT 适合大多数微服务场景”
-
故障排查
“死锁问题用 SHOW ENGINE INNODB STATUS 分析,事务监控重点看 trx_rows_modified 和 lock_wait_time”
掌握这些知识,你不仅能应对 Java 面试中的事务相关问题,更能为高并发、分布式系统设计打下坚实基础。
📜文末寄语
- 🟠关注我,获取更多内容。
- 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
- 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
- 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
- 🟣点击下方名片获取更多内容🍭🍭🍭👇
相关文章:
MySQL 事务深度解析:面试核心知识点与实战
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Java 中 MySQL 事务深度解析:面试…...
使用Redis作为缓存,提高MongoDB的读写速度
在现代Web应用中,随着数据量和访问量的增长,数据库性能常常成为系统瓶颈。MongoDB作为NoSQL数据库,虽然具备高扩展性和灵活性,但在某些读密集型场景下仍可能遇到性能问题。 本文将介绍如何使用Redis作为缓存层来显著提升MongoDB的读写性能,包括架构设计、详细设计、Pytho…...

【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
现在的工作单位经常搞一些意义不明的绩效工作,每个月都搞来一万多张图片让我们挨个打开对应图片上的名字进行改名操作以方便公司领导进行检查和搜索调阅,图片上面的内容有数字和文字,数字没有特殊意义不做识别,文字有手写的和手机…...
Kafka消息队列笔记
一、Kafka 核心架构 四大组件 Producer:发布消息到指定 Topic。 Consumer:订阅 Topic 并消费消息(支持消费者组并行)。 Broker:Kafka 服务器节点,存储消息,处理读写请求。 ZooKeeper/KRaft&a…...
机器人变量类型与配置
机器人变量类型与配置 机器人变量类型与配置知识 1. 变量类型 1.1 按创建位置分类 程序变量: 仅适用于当前运行程序程序停止后变量值丢失可在赋值程序节点中直接创建 配置变量: 可用于多个程序变量名和值在机器人安装期间持续存在需预先在配置变量界面…...
nssm配置springboot项目环境,注册为windows服务
NSSM 的官方下载地址是:NSSM - the Non-Sucking Service Manager1 使用powershell输入命令,java项目需要手动配置和依赖nacos .\nssm.exe install cyMinio "D:\minio\启动命令.bat" .\nssm.exe install cyNacos "D:\IdeaProject\capacity\nacos-s…...

20-项目部署(Docker)
在昨天的课程中,我们学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么? 我相信,除了个别天赋异禀的同学以外,大多数同学都会有相同的…...
Python学习(6) ----- Python2和Python3的区别
Python2 和 Python3 是两个主要版本的 Python 编程语言,它们之间有许多重要的区别。Python3 是对 Python2 的一次重大升级,不完全兼容旧版本。以下是它们的主要区别: 🧵 基本语法差异 1. 打印语法 Python2:print 是一…...

零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南
零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南 本文是一篇超详细“Python安装教程”,覆盖Windows、macOS、Linux三大操作系统的Python安装方法与环境配置,包括Pyt…...

SAP学习笔记 - 开发18 - 前端Fiori开发 应用描述符(manifest.json)的用途
上一章讲了 Component配置(组件化)。 本章继续讲Fiori的知识。 目录 1,应用描述符(Descriptor for Applications) 1), manifest.json 2),index.html 3),Component.…...
分类与逻辑回归 - 一个完整的guide
线性回归和逻辑回归其实比你想象的更相似 😃 它们都是所谓的参数模型。让我们先看看什么是参数模型,以及它们与非参数模型的区别。 线性回归 vs 逻辑回归 线性回归:用于回归问题的线性参数模型。逻辑回归:用于分类问题的线性参数模型。参数回归模型: 假设函数形式 模型假…...

一键试衣,6G显存可跑
发现一个好玩的一键换衣的工作流,推荐给大家。 https://github.com/chflame163/ComfyUI_CatVTON_Wrapper 作者参考的是开源项目,做成了工作流形式。 https://github.com/Zheng-Chong/CatVTON 先来看下效果,使用动画人物也可换衣ÿ…...
跟着deepseek浅学分布式事务(2) - 两阶段提交(2PC)
文章目录 一、核心角色二、流程详解三、关键示例四、致命缺点五、改进方案六、适用场景七、伪代码1. 参与者(Participant)2. 协调者(Coordinator)3. 模拟运行(Main Class)4. 关键问题模拟 八、待改进问题总…...
【仿生机器人软件架构】通过整合认知系统实现自主精神性——认知系统非常具有可执行性
来自Claude 4.0 pro深度思考 仿生机器人软件架构:通过整合认知系统实现自主精神性 要创建具有真正情感深度的、完全自主的仿生机器人,需要超越基于规则的系统,转向能够实现涌现行为、自适应个性和类似意识处理的架构。根据截至2024年初的现…...

20250602在Ubuntu20.04.6下修改压缩包的日期和时间
rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 5月 23 10:23 Android13.0地面站.tgz* rootrootrootroot-X99-Turbo:~$ touch 1Android13.0地面站.tgz rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 6月…...
Fullstack 面试复习笔记:项目梳理总结
Fullstack 面试复习笔记:项目梳理总结 之前的笔记: Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结 这篇笔记主自用,系统地梳理一下最近…...

星闪开发之Server-Client 指令交互控制OLED灯案例
系列文章目录 星闪开发之Server-Client 指令交互控制OLED灯案例 文章目录 系列文章目录前言一、核心流程服务端客户端 二、图片资源三、源代码四、在Hispark Studio中配置将sle_oled-master文件夹下的相sle_oled放在peripheral文件夹下。peripheral目录下的 Kconfig文件中添加…...

MySQL补充知识点学习
书接上文:MySQL关系型数据库学习,继续看书补充MySQL知识点学习。 1. 基本概念学习 1.1 游标(Cursor) MySQL 游标是一种数据库对象,它允许应用程序逐行处理查询结果集,而不是一次性获取所有结果。游标在需…...
《前端面试题:CSS有哪些单位!》
CSS单位大全:从像素到容器单位的前端度量指南 精通CSS单位是构建响应式、灵活布局的关键技能,也是面试中的必考知识点 一、CSS单位的重要性与分类 在网页设计中,CSS单位是控制元素尺寸、间距和定位的基础。不同的单位提供了不同的计算方式和…...

[ctfshow web入门] web80
信息收集 过滤了php和data if(isset($_GET[file])){$file $_GET[file];$file str_replace("php", "???", $file);$file str_replace("data", "???", $file);include($file); }else{highlight_file(__FILE__); }解题 大小写…...

【设计模式-4.5】行为型——迭代器模式
说明:本文介绍设计模式中,行为型设计模式之一的迭代器模式。 定义 迭代器模式(Iterator Pattern),也叫作游标模式(Cursor Pattern),它提供一种按顺序访问集合/容器对象元素的方法&…...

C++_核心编程_继承中的对象模型
继承中的对象模型 **问题:**从父类继承过来的成员,哪些属于子类对象中? * 结论: 父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到 */ class Base { public:int m_A; protected:int m_B; private:int…...

使用cephadm离线部署reef 18版并配置对接openstack
源 curl --silent --remote-name --location https://download.ceph.com/rpm-squid/el9/noarch/cephadm chmod x cephadm./cephadm add-repo --release reef监视节点 离线下载 apt-get --download-only install ceph ceph-mon ceph-mgr ceph-commonmkdir /reef/mon mv /var/…...
Redis最佳实践——性能优化技巧之缓存预热与淘汰策略
Redis在电商应用中的缓存预热与淘汰策略优化 一、缓存预热核心策略 1. 预热数据识别方法 热点数据发现矩阵: 维度数据特征发现方法历史访问频率日访问量>10万次分析Nginx日志,使用ELK统计时间敏感性秒杀商品、新品上线运营数据同步关联数据购物车关…...

2024年数维杯国际大学生数学建模挑战赛D题城市弹性与可持续发展能力评价解题全过程论文及程序
2024年数维杯国际大学生数学建模挑战赛 D题 城市弹性与可持续发展能力评价 原题再现: 中国人口老龄化趋势的加剧和2022年首次出现人口负增长,表明未来一段较长时期内我国人口将呈现下降趋势。这一趋势必将影响许多城市的高质量和可持续发展,…...
3D Gaussian splatting 06: 代码阅读-训练参数
目录 3D Gaussian splatting 01: 环境搭建3D Gaussian splatting 02: 快速评估3D Gaussian splatting 03: 用户数据训练和结果查看3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云3D Gaussian splatting 05: 代码阅读-训练整体流程3D Gaussian splatting 06: 代码…...

QT聊天项目DAY13
1. 重置密码 重置密码label也要实现浮动和点击效果,所以将忘记密码这个标签提升为ClickedLabel 1.1 ClickedLabel的复用 由于样式表(.qss) 文件中可以写入多个控件的状态UI,所以为了ClickedLabel能够复用,将成员变量的初始化方式修改为函数…...

Web3如何重塑数据隐私的未来
在这个信息爆炸的时代,数据隐私已成为我们不得不面对的严峻问题。Web3,作为下一代互联网的代表,以其去中心化、用户主权和数据安全等特点,正在重塑数据隐私的未来。它不仅仅是技术的革新,更是对个人隐私保护理念的一次…...

【鸿蒙】HarmonyOS NEXT之如何正常加载地图组件
1、不支持模拟器,需要真机! 2、Map地图需要在AGC上申请权限,需要在AGC上创建对应的项目 地址: AppGallery Connect 2.1 AGC中项目创建 2.1.1 添加项目 2.1.2 起个名字 2.1.3 添加应用: 2.1.4 选择HarmonyOS APP&…...

前端框架进化史
本内容是对 You’ll Never Manually Update the DOM Again // Here’s Why 内容的翻译与整理。 你再也不需要手工更新DOM, 以下是原因 现代 JavaScript 框架,如 React、Vue、Svelte、Solid、Quick,以及本周推出的其他 786 个框架,都试图做一些…...