首页/案例库/MySQL InnoDB 事务与锁
进阶数据库

MySQL InnoDB 事务与锁

一次转账操作如何保证 ACID 的完整故事

InnoDB 是 MySQL 默认存储引擎,也是互联网核心业务数据的守护者。它用 Undo Log 实现事务回滚和 MVCC 多版本并发控制,让读操作不阻塞写操作;用 Redo Log(WAL 预写日志)保证即便服务���������也不������据;���级���(Record Lock + Gap Lock)精准到每一行,避免全表锁带来的并发瓶颈。理解 InnoDB 的锁机制,你就能读懂绝大多数生产数据库慢查询和死锁告警的根本原因。

MySQLInnoDBACIDMVCCWAL行级锁死锁
STEP_1
MVCC 让读操作无需加锁,大幅提升并发性能
分配事务 ID,创建 READVIEW — PROCESSING
begin.log
-- 开启事务
BEGIN;  -- 等同于 START TRANSACTION

-- InnoDB 内部:分配 trx_id = 1234567
-- 创建 ReadView: {
--   m_low_limit_id: 1234568,   // >= 此值的事务不可见
--   m_up_limit_id:  1234500,   // < 此值的事务全部可见
--   m_ids: [1234501, 1234510]  // 当前活跃事务,不可见
-- }

-- 查看当前事务 ID
SELECT trx_id FROM information_schema.INNODB_TRX
WHERE trx_mysql_thread_id = CONNECTION_ID();

BEGIN 开启事务执行 BEGIN(或 START TRANSACTION)时,InnoDB 为该事务分配一个单调递增的事务 ID(trx_id)。同时基于当前活跃事务列表创建 ReadView 快照,决定该事务能看到哪些版本的数据——这是 MVCC 的核心。已提交事务修改的数据可见,未提交事务的修改不可见(可重复读隔离级别下,ReadView 在整个事务期间保持不变,所以两次相同查询结果一致)。

实时沙盒SANDBOX
NOMINAL
快速场景
手动调节
事务隔离级别
影响并发与一致性平衡
可重复读:幻读用 Gap Lock 防护,性能与一致性平衡
并发事务数
同时进行的写事务
10
并发适中,锁竞争可控
模拟数据库宕机
数据库正常运行
Redo Log 刷盘策略
innodb_flush_log_at_trx_commit
选择 =1 时数据最安全,但每次提交有 fsync 开销