引言
事务和锁是数据库并发控制的核心。本文系统讲解MySQL的事务和锁机制。
一、事务基础
1.1 ACID特性
1 2 3 4 5 6 7 8 9 10 11
| START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;
|
1.2 事务操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| START TRANSACTION;
BEGIN;
COMMIT;
ROLLBACK;
SAVEPOINT sp1; ROLLBACK TO sp1;
|
二、隔离级别
2.1 四种隔离级别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT @@transaction_isolation;
|
2.2 并发问题
三、MVCC机制
3.1 MVCC原理
3.2 Read View
四、锁机制
4.1 锁类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| LOCK TABLES users READ; LOCK TABLES users WRITE; UNLOCK TABLES;
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;
SELECT * FROM users WHERE id = 1 FOR UPDATE;
|
4.2 锁兼容性
1 2 3 4
| | S锁 | X锁 | -------|-----|-----| S锁 | ✓ | ✗ | X锁 | ✗ | ✗ |
|
五、死锁
5.1 死锁示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| START TRANSACTION; UPDATE users SET name = 'A' WHERE id = 1;
UPDATE users SET name = 'A' WHERE id = 2;
START TRANSACTION; UPDATE users SET name = 'B' WHERE id = 2;
UPDATE users SET name = 'B' WHERE id = 1;
|
5.2 死锁检测与处理
1 2 3 4 5 6 7 8 9 10 11
| SHOW ENGINE INNODB STATUS;
|
六、性能优化
6.1 锁优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE INDEX idx_user_id ON orders(user_id);
START TRANSACTION;
COMMIT;
START TRANSACTION;
COMMIT;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET innodb_lock_wait_timeout = 50;
|
七、监控与诊断
7.1 查看锁信息
1 2 3 4 5 6 7 8 9 10 11
| SELECT * FROM performance_schema.data_locks;
SELECT * FROM performance_schema.data_lock_waits;
SELECT * FROM information_schema.innodb_trx;
SHOW ENGINE INNODB STATUS;
|
总结
MySQL事务与锁核心:
- ACID特性:原子性、一致性、隔离性、持久性
- 隔离级别:RU、RC、RR、SERIALIZABLE
- MVCC:多版本并发控制
- 锁类型:表锁、行锁、间隙锁、临键锁
- 死锁处理:检测、预防、优化
参考资料