MySQL 事务 第一章什么是事务事务一组 SQL 操作要么全部执行成功要么全部失败回滚。例如转账UPDATE account SET moneymoney-100 WHERE id1; UPDATE account SET moneymoney100 WHERE id2;这两个 SQL 是一个整体。开启事务START TRANSACTION;提交COMMIT;回滚ROLLBACK;第二章为什么需要事务没有事务例如订单创建步骤1. 创建订单 2. 扣库存 3. 扣余额如果订单创建成功 库存扣除失败数据订单存在 库存没变化产生脏数据。事务创建订单 ↓ 扣库存 ↓ 扣余额 ↓ 全部成功 COMMIT 否则 ROLLBACK第三章ACID 四大特性 ⭐⭐⭐⭐⭐事务必须满足1. Atomicity原子性一个事务不可拆分。例如转账扣钱 加钱必须一起成功。失败全部撤销。实现Undo Log回滚日志2. Consistency一致性事务执行前后数据保持正确状态。例如账户总金额1000转账后500 500不会500 4003. Isolation隔离性多个事务同时执行互不影响。例如两个用户同时购买商品。不会看到中间状态。实现锁机制 MVCC4. Durability持久性提交后的数据永久保存。即使服务器宕机数据不会丢。实现Redo Log第四章事务隔离级别 ⭐⭐⭐⭐⭐多个事务同时执行会产生问题1. 脏读事务A读取未提交数据。例如A修改余额1000→500还没提交。B读取500之后A回滚。B读取了不存在的数据。2. 不可重复读同一个事务两次查询结果不同。例如第一次余额1000别人修改500第二次5003. 幻读查询范围数据数量变化。例如第一次SELECT * FROM order WHERE status1;结果10条。另一个事务插入5条。再次查询15条。五、四种隔离级别MySQL隔离级别脏读不可重复读幻读READ UNCOMMITTED√√√READ COMMITTED×√√REPEATABLE READ××√SERIALIZABLE×××MySQL InnoDB 默认REPEATABLE READ六、为什么 MySQL 默认 REPEATABLE READ因为性能和一致性的平衡。相比 SERIALIZABLE性能更高并发更好同时通过MVCC解决大部分读取问题。七、MVCC 多版本并发控制 ⭐⭐⭐⭐⭐MVCCMulti-Version Concurrency Control中文多版本并发控制。作用让读操作不需要加锁提高并发。例如数据id1 nameTom修改nameJackMySQL 不直接覆盖。保存多个版本版本1 Tom 版本2 Jack事务根据自己的视图读取。八、MVCC 依赖什么主要依赖1. Undo Log保存旧版本数据。作用回滚MVCC读取历史版本2. Read View判断当前事务应该看到哪个版本。九、MySQL 日志机制 ⭐⭐⭐⭐⭐MySQL 主要有1. Undo Log作用回滚。例如事务失败恢复旧数据。2. Redo Log作用保证持久性。流程修改数据 ↓ 写Redo Log ↓ 提交 ↓ 刷新磁盘即使宕机可以恢复。3. Binlog作用记录数据库变化。用途主从复制数据恢复十、Redo Log 和 Binlog 区别 ⭐⭐⭐⭐⭐Redo LogBinlog属于InnoDBMySQL Server作用崩溃恢复复制恢复格式物理日志逻辑日志是否循环是否十一、事务使用规范1. 事务不要太大错误开启事务 处理10万个数据 提交问题锁时间长占资源2. 不要在事务中调用外部服务错误事务开始 ↓ 调用微信支付 ↓ 提交原因第三方接口可能很慢。正确数据库事务 ↓ 提交成功 ↓ 发送消息通知3. 合理控制事务范围只包含必须一起成功的数据操作。十二、企业案例创建订单需求用户购买商品步骤创建订单保存订单商品扣库存扣余额事务BEGIN 创建订单 保存订单明细 扣库存 扣余额 全部成功 COMMIT 失败 ROLLBACK十三、本章总结知识作用事务保证数据一致ACID事务四大特性隔离级别控制并发影响MVCC提高读并发Undo Log回滚和历史版本Redo Log保证持久性Binlog复制和恢复一句话总结事务通过 ACID、MVCC 和日志机制让数据库在高并发和故障情况下仍然保持数据正确。思考题精简回答为什么订单创建必须使用事务因为订单涉及多个操作这些操作必须全部成功或全部失败ACID 四个特性分别解决什么问题特性解决问题原子性 Atomicity保证事务全部成功或全部失败一致性 Consistency保证数据始终正确隔离性 Isolation避免多个事务互相影响持久性 Durability保证提交后的数据不会丢失脏读、不可重复读、幻读分别是什么脏读读取了其他事务未提交的数据。不可重复读同一个事务两次读取同一数据结果不同。幻读同一个事务两次查询的数据数量不同。MySQL 为什么默认使用 REPEATABLE READ因为它在数据一致性、查询性能、并发能力之间取得平衡。相比最高级别 SERIALIZABLE锁更少、性能更高。同时 InnoDB 使用 MVCC 降低读取冲突。MVCC 为什么可以提高数据库并发因为MVCC让读操作不需要一直等待写操作。Undo Log、Redo Log、Binlog 分别有什么作用日志作用Undo Log回滚事务保存旧数据版本Redo Log保证数据持久化崩溃恢复Binlog记录数据库变化用于主从复制和数据恢复为什么事务中不应该调用第三方接口因为第三方接口响应时间不可控、可能失败、可能超时