目录事务一 事务的四大特性ACID1 原子性(Atomicity) 2 一致性(Consistent)3 隔离性Isolation4 持久性Durability二 事务的生命周期三 并发事务带来的问题四 事务的隔离级别MySQL 可重复读的特殊性五 事务的实现原理1. Redo Log重做日志2. Undo Log回滚日志3. MVCC多版本并发控制六 事务最佳实践七 事务选择决策事务事务是数据库管理系统执行过程中的一个逻辑工作单元它由一系列数据库操作组成这些操作要么全部成功要么全部失败不会出现部分成功、部分失败的情况。一 事务的四大特性ACID1 原子性(Atomicity) 定义事务中的所有操作是一个不可分割的整体要么全部执行成功要么全部不执行回滚。实现原理Undo Log回滚日志记录数据修改前的旧值事务失败时通过 Undo Log 将数据恢复到事务开始前的状态2 一致性(Consistent)定义事务执行前后数据库从一个一致状态转变为另一个一致状态完整性约束不被破坏。注意一致性是 ACID 的最终目标原子性、隔离性、持久性都是为了实现一致性。3 隔离性Isolation定义多个事务并发执行时相互隔离互不干扰。实现原理锁机制共享锁、排他锁MVCC多版本并发控制通过数据版本链实现读写不互斥隔离级别从低到高读未提交可能脏读读已提交避免脏读可重复读避免脏读、不可重复读MySQL默认串行化避免所有并发问题4 持久性Durability定义事务一旦提交对数据的修改就是永久性的即使系统崩溃也不会丢失。实现原理Redo Log重做日志记录数据修改后的新值事务提交时先将 Redo Log 写入磁盘系统恢复时通过 Redo Log 重放已提交的事务两阶段提交事务执行 → 写入 Redo Logprepare状态→ 写入binlog →提交 → Redo Log 变为 commit 状态 → 数据写入磁盘空闲时二 事务的生命周期-- 1. 开始事务START TRANSACTION; -- 或 BEGIN;-- 2. 执行 SQL 操作INSERT INTO user(name) VALUES(张三);UPDATE account SET balance 1000 WHERE id 1;-- 3. 提交事务永久生效COMMIT;-- 或回滚事务撤销所有操作ROLLBACK;三 并发事务带来的问题问题描述示例脏读读到其他事务未提交的数据事务A读到事务B未提交的修改B回滚A读到脏数据不可重复读同一事务内两次读同一数据结果不同不符合隔离性事务A两次读取余额中间事务B修改并提交两次结果不一致幻读同一事务内两次范围查询结果集行数不同不符合隔离性事务A两次查询用户列表中间事务B插入新用户两次结果条数不同丢失更新后提交的更新覆盖了先提交的更新两人同时编辑同一数据后保存者覆盖先保存者的修改四 事务的隔离级别隔离级别脏读不可重复读幻读并发性能默认数据库读未提交❌ 可能❌ 可能❌ 可能最高-读已提交✅避免❌ 可能❌ 可能高Oracle, SQL Server可重复读✅ 避免✅ 避免⚠️ InnoDB解决中MySQL串行化✅ 避免✅ 避免✅ 避免最低-MySQL 可重复读的特殊性MySQL InnoDB 通过以下机制在可重复读级别解决了幻读MVCC多版本并发控制事务在第一次读取时生成快照Read View后续所有读取都基于这个快照。间隙锁Gap Lock在范围查询时锁定索引记录之间的间隙防止幻影行插入。五 事务的实现原理1. Redo Log重做日志作用保证持久性机制记录数据修改后的新值采用 WALWrite-Ahead Logging技术先写日志后写磁盘循环写入固定大小写满后会触发 checkpoint2. Undo Log回滚日志作用保证原子性和 MVCC机制记录数据修改前的旧值用于事务回滚和数据版本管理形成版本链支持 MVCC 快照读3. MVCC多版本并发控制核心思想读写不互斥写操作创建新版本读操作读取旧版本关键组件隐藏字段DB_TRX_ID事务ID、DB_ROLL_PTR回滚指针Read View一致性视图记录当前活跃事务列表Undo Log 版本链按时间顺序存储的历史版本读操作分类快照读普通SELECT读取历史版本无锁当前读SELECT ... FOR UPDATE、UPDATE、DELETE读取最新版本加锁六 事务最佳实践实践说明示例事务粒度最小化只在必要范围内使用事务将网络请求、文件操作移出事务只读事务优化纯查询使用readOnlytrueTransactional(readOnly true)明确回滚规则指定需要回滚的异常类型Transactional(rollbackFor Exception.class)合理的隔离级别根据业务选择避免盲目使用串行化默认可重复读即可满足多数场景处理事务失效注意 self-invocation、public方法等通过代理调用或注入自身监控长事务避免事务持有时间过长设置超时时间timeout 30七 事务选择决策场景推荐方案隔离级别锁策略简单增删改默认事务可重复读默认行锁复杂报表查询只读事务可重复读无锁快照读高并发扣库存乐观锁读已提交版本号机制热点账户转账悲观锁读已提交SELECT FOR UPDATE数据一致性要求极高串行化串行化表锁/间隙锁分布式事务最终一致性读已提交TCC/消息表事务是保证数据一致性的核心机制但需要谨慎使用事务范围太小可能无法保证一致性太大则会影响性能。在实际开发中需要在数据一致性和系统性能之间找到平衡点。
MySQL事务隔离级别
目录事务一 事务的四大特性ACID1 原子性(Atomicity) 2 一致性(Consistent)3 隔离性Isolation4 持久性Durability二 事务的生命周期三 并发事务带来的问题四 事务的隔离级别MySQL 可重复读的特殊性五 事务的实现原理1. Redo Log重做日志2. Undo Log回滚日志3. MVCC多版本并发控制六 事务最佳实践七 事务选择决策事务事务是数据库管理系统执行过程中的一个逻辑工作单元它由一系列数据库操作组成这些操作要么全部成功要么全部失败不会出现部分成功、部分失败的情况。一 事务的四大特性ACID1 原子性(Atomicity) 定义事务中的所有操作是一个不可分割的整体要么全部执行成功要么全部不执行回滚。实现原理Undo Log回滚日志记录数据修改前的旧值事务失败时通过 Undo Log 将数据恢复到事务开始前的状态2 一致性(Consistent)定义事务执行前后数据库从一个一致状态转变为另一个一致状态完整性约束不被破坏。注意一致性是 ACID 的最终目标原子性、隔离性、持久性都是为了实现一致性。3 隔离性Isolation定义多个事务并发执行时相互隔离互不干扰。实现原理锁机制共享锁、排他锁MVCC多版本并发控制通过数据版本链实现读写不互斥隔离级别从低到高读未提交可能脏读读已提交避免脏读可重复读避免脏读、不可重复读MySQL默认串行化避免所有并发问题4 持久性Durability定义事务一旦提交对数据的修改就是永久性的即使系统崩溃也不会丢失。实现原理Redo Log重做日志记录数据修改后的新值事务提交时先将 Redo Log 写入磁盘系统恢复时通过 Redo Log 重放已提交的事务两阶段提交事务执行 → 写入 Redo Logprepare状态→ 写入binlog →提交 → Redo Log 变为 commit 状态 → 数据写入磁盘空闲时二 事务的生命周期-- 1. 开始事务START TRANSACTION; -- 或 BEGIN;-- 2. 执行 SQL 操作INSERT INTO user(name) VALUES(张三);UPDATE account SET balance 1000 WHERE id 1;-- 3. 提交事务永久生效COMMIT;-- 或回滚事务撤销所有操作ROLLBACK;三 并发事务带来的问题问题描述示例脏读读到其他事务未提交的数据事务A读到事务B未提交的修改B回滚A读到脏数据不可重复读同一事务内两次读同一数据结果不同不符合隔离性事务A两次读取余额中间事务B修改并提交两次结果不一致幻读同一事务内两次范围查询结果集行数不同不符合隔离性事务A两次查询用户列表中间事务B插入新用户两次结果条数不同丢失更新后提交的更新覆盖了先提交的更新两人同时编辑同一数据后保存者覆盖先保存者的修改四 事务的隔离级别隔离级别脏读不可重复读幻读并发性能默认数据库读未提交❌ 可能❌ 可能❌ 可能最高-读已提交✅避免❌ 可能❌ 可能高Oracle, SQL Server可重复读✅ 避免✅ 避免⚠️ InnoDB解决中MySQL串行化✅ 避免✅ 避免✅ 避免最低-MySQL 可重复读的特殊性MySQL InnoDB 通过以下机制在可重复读级别解决了幻读MVCC多版本并发控制事务在第一次读取时生成快照Read View后续所有读取都基于这个快照。间隙锁Gap Lock在范围查询时锁定索引记录之间的间隙防止幻影行插入。五 事务的实现原理1. Redo Log重做日志作用保证持久性机制记录数据修改后的新值采用 WALWrite-Ahead Logging技术先写日志后写磁盘循环写入固定大小写满后会触发 checkpoint2. Undo Log回滚日志作用保证原子性和 MVCC机制记录数据修改前的旧值用于事务回滚和数据版本管理形成版本链支持 MVCC 快照读3. MVCC多版本并发控制核心思想读写不互斥写操作创建新版本读操作读取旧版本关键组件隐藏字段DB_TRX_ID事务ID、DB_ROLL_PTR回滚指针Read View一致性视图记录当前活跃事务列表Undo Log 版本链按时间顺序存储的历史版本读操作分类快照读普通SELECT读取历史版本无锁当前读SELECT ... FOR UPDATE、UPDATE、DELETE读取最新版本加锁六 事务最佳实践实践说明示例事务粒度最小化只在必要范围内使用事务将网络请求、文件操作移出事务只读事务优化纯查询使用readOnlytrueTransactional(readOnly true)明确回滚规则指定需要回滚的异常类型Transactional(rollbackFor Exception.class)合理的隔离级别根据业务选择避免盲目使用串行化默认可重复读即可满足多数场景处理事务失效注意 self-invocation、public方法等通过代理调用或注入自身监控长事务避免事务持有时间过长设置超时时间timeout 30七 事务选择决策场景推荐方案隔离级别锁策略简单增删改默认事务可重复读默认行锁复杂报表查询只读事务可重复读无锁快照读高并发扣库存乐观锁读已提交版本号机制热点账户转账悲观锁读已提交SELECT FOR UPDATE数据一致性要求极高串行化串行化表锁/间隙锁分布式事务最终一致性读已提交TCC/消息表事务是保证数据一致性的核心机制但需要谨慎使用事务范围太小可能无法保证一致性太大则会影响性能。在实际开发中需要在数据一致性和系统性能之间找到平衡点。