MySQL 事务与锁机制深度解析
在关系型数据库开发里,事务和锁是绕不开的核心概念。它们共同构成了数据一致性和并发控制的基石。咱们今天不照本宣科,直接聊聊 ACID 特性、隔离级别以及 InnoDB 的锁实现,希望能帮你在实际项目中更好地设计数据库操作。
1. 事务基础
1.1 什么是事务?
简单说,事务就是一组不可分割的操作单元。要么全成功,要么全回滚。这保证了原子性,避免出现'部分成功、部分失败'的尴尬状态。
1.2 ACID 特性
事务的可靠性建立在四大原则上:
- 原子性(Atomicity):所有操作视为一个整体,要么全部完成,要么全部撤销。
- 一致性(Consistency):事务前后,数据库必须满足所有业务规则和约束,状态始终合法。
- 隔离性(Isolation):并发执行的事务互不干扰,中间状态对其他事务不可见。
- 持久性(Durability):一旦提交,结果永久保存,即使宕机也不会丢失。
2. MySQL 中的事务
2.1 存储引擎选择
- InnoDB:默认引擎,全面支持 ACID,生产环境首选。
- MyISAM:不支持事务,仅适合读多写少的场景,现在用得少了。
2.2 开启与管理
控制事务主要靠几条 SQL 命令:
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 能识别紧凑写法,但可读性差容易出错。
3. 事务隔离级别
并发环境下,脏读、不可重复读和幻读是三大坑。MySQL (InnoDB) 提供了四种级别来应对:
- READ UNCOMMITTED(读未提交):最低级别,允许读脏数据,基本不用。
- READ COMMITTED(读已提交):只读已提交的数据,避免脏读,但可能不可重复读。


