MySQL 事务与锁机制深度解析
在关系型数据库开发中,事务和锁是保证数据一致性的基石。很多并发问题其实都源于对这两者的理解偏差。本文聚焦 MySQL(尤其是 InnoDB 引擎),梳理事务的核心概念、隔离级别以及锁的实现细节,帮助大家在设计高并发系统时少走弯路。
事务基础
什么是事务?
事务是一组不可分割的操作单元,要么全部成功,要么全部回滚。它确保了原子性,避免出现'部分成功'的中间状态。
ACID 特性
这是事务的四大支柱:
- 原子性:操作整体执行,失败则全退。
- 一致性:事务前后数据库状态符合业务规则。
- 隔离性:并发事务互不干扰,中间状态不可见。
- 持久性:提交后永久保存,故障不丢失。
MySQL 中的事务实践
存储引擎选择
- InnoDB:默认引擎,支持 ACID,适合强一致性场景。
- MyISAM:不支持事务,仅适合读多写少。
开启与管理
控制事务流转主要靠三条指令:
START TRANSACTION/BEGIN:开始事务。COMMIT:提交变更。ROLLBACK:撤销变更。
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 此处可插入余额检查等逻辑
COMMIT;
注意,如果中间某步报错且未捕获,需手动回滚,否则可能处于未提交状态。
事务隔离级别
并发环境下,脏读、不可重复读和幻读是三大隐患。MySQL InnoDB 提供四种级别:
- READ UNCOMMITTED:最低级,允许脏读,极少使用。
- READ COMMITTED:只读已提交数据,避免脏读,但同一事务内多次读取可能结果不同。
- REPEATABLE READ:默认级别。保证事务内多次读取一致。InnoDB 通过 Next-Key Lock 解决了大部分幻读问题。
- SERIALIZABLE:串行化,性能开销大,仅特殊场景用。


