数据库中的 Lock(锁) 是用来保证 并发访问数据一致性 和 事务隔离性 的机制。它的核心原理可以概括为:在访问数据前,先申请锁;获得锁才能操作,操作完释放锁;其他线程/事务若需要冲突的锁,就必须等待。
下面从几个层次讲清楚原理。
多个事务同时操作数据库时,可能出现问题:
锁的作用就是:控制谁能在什么时间、以什么方式访问数据。
数据库把锁加在资源上,比如:
例如:
UPDATE user SET age=20 WHERE id=1;
数据库会在 id=1 这一行上加上 排他锁(X Lock)。
SELECT ... LOCK IN SHARE MODE;
UPDATE / DELETE / INSERT
兼容性矩阵(简化)
| 已有锁 \ 请求锁 | S | X |
|---|---|---|
| S | ✅ | ❌ |
| X | ❌ | ❌ |
数据库通常遵循 2PL(Two-Phase Locking):
BEGIN;
加锁 → 加锁 → 操作 → 操作
COMMIT; ← 这里才释放锁
而是:
在索引上加锁
如果:
WHERE id=1 → 锁索引记录锁具体某一行
WHERE id = 1
锁“两个值之间的空隙”,防止插入
WHERE age BETWEEN 10 AND 20
= Record Lock + Gap Lock
防止幻读(MySQL 默认)
事务 A 持有锁,事务 B 等待:
B: 等待 A 释放锁
超时则报错:
Lock wait timeout exceeded
A 锁了 1,等 2
B 锁了 2,等 1
数据库会:
| 隔离级别 | 锁行为 |
|---|---|
| 读未提交 | 几乎不加锁 |
| 读已提交 | 行锁 |
| 可重复读 | 行锁 + Gap Lock |
| 串行化 | 大量锁,性能低 |
数据库 Lock 的本质是:通过“标记资源是否被占用”,在并发环境下强制事务按顺序、安全地访问数据。
如果你愿意,我可以:
你想从哪一个角度继续?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。