type
Post
status
Published
password
date
Dec 6, 2025
slug
summary
category
数据库
URL
tags
hive
icon
join操作
事务性
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
例如张三向李四转账
张三向李四转账会经过3个环节。1. 查询张三的余额(余够不够1000元)2. 张三的余额减1000元 3. 李四的余额增加1000元。这三个环节只能同时成功或者同时失败,否则可能出现张三余额减1000元,李四账户余额增加1000元失败的情况。
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
- 一致性:在事务开始之前和事务结束以后,数据库的数据完整性约束、业务规则始终保持一致。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性:事务一旦提交或回滚,它对数据的修改就是永久的,即便系统故障也不会丢失。
原子性与一致性
特性 | 是否满足? | 具体表现 |
原子性 | ✅ 满足 | 事务内的 “扣钱 + 加钱” 两个操作全部执行,无拆分、无回滚,完全符合 “要么全做、要么全不做”; |
一致性 | ❌ 不满足 | 执行后:张三余额 =-100(违反 “余额不能为负” 的业务规则),虽然总余额 = 1500(符合),但单账户数据非法; |
隔离性
并发问题
问题 | 描述 |
赃读 | 一个事务读到另外一个事务还没有提交的数据 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是插入数据时,又发现这行数据已经存在,好像出现了幻影 |
隔离级别
隔离级别 | 性能 | 脏读 | 不可重复读 | 幻读 | 适用场景 |
读未提交 | 最高 | ❌ 可能 | ❌ 可能 | ❌ 可能 | 极少用(如临时统计、非核心数据) |
读已提交 | 高 | ✅ 防止 | ❌ 可能 | ❌ 可能 | 多数互联网场景(如电商列表、新闻详情) |
可重复读 | 中 | ✅ 防止 | ✅ 防止 | ❌ 可能* | 金融、电商订单(需保证同一事务内数据一致) |
可串行化 | 最低 | ✅ 防止 | ✅ 防止 | ✅ 防止 | 核心交易(如转账、支付) |
总结
持久性
持久性机制
- 事务执行阶段:修改数据时,先写入「内存缓冲区(Buffer Pool)」,同时记录「WAL 日志(如 InnoDB 的 redo log)」到「日志缓冲区(Log Buffer)」;
- 此时数据还在内存,没写硬盘,但日志已记录 “要修改什么”;
- 事务提交阶段(关键):
- 第一步:将「日志缓冲区」的 WAL 日志刷到「硬盘日志文件」(这一步是同步的,必须完成才算提交成功);
- 第二步:后台线程异步将「内存缓冲区」的脏数据(已修改但未写硬盘的数据)刷到「硬盘数据文件」(表空间文件);
- 故障恢复阶段:如果提交后、数据刷盘前发生断电,重启数据库时,会读取 WAL 日志,重新执行日志中的修改操作,确保数据最终落地。