SQL 的锁机制主要用于保证并发访问数据库时的数据一致性与隔离性。不同数据库(MySQL、PostgreSQL、Oracle、SQL Server)实现细节不同,但核心思想一致。下面以通用原理 + MySQL(InnoDB)为例说明。
当多个事务同时:
可能出现:
锁就是用来控制谁能在什么时间访问什么数据。
| 锁类型 | 说明 |
|---|---|
| 行锁(Row Lock) | 锁一行数据(InnoDB 支持) |
| 表锁(Table Lock) | 锁整张表(MyISAM 常用) |
| 页锁(Page Lock) | 锁一页数据(少见) |
✅ InnoDB 默认使用行级锁
| 锁类型 | 说明 |
|---|---|
| 共享锁(S锁 / Read Lock) | 多人可同时读 |
| 排他锁(X锁 / Write Lock) | 只能一人写 |
规则:
| 类型 | 说明 |
|---|---|
| 悲观锁 | 假设会冲突,先加锁 |
| 乐观锁 | 假设不冲突,提交时校验(版本号 / 时间戳) |
UPDATE user SET age=20 WHERE id=1;
id=1 加 排他锁(X)SELECT * FROM user WHERE id=1;
-- 加共享锁
SELECT * FROM user WHERE id=1 LOCK IN SHARE MODE;
-- 加排他锁
SELECT * FROM user WHERE id=1 FOR UPDATE;
InnoDB 通过 MVCC 减少锁冲突:
undo log + 事务ID 实现✅ 所以:
用于表级 & 行级协调
| 锁 | 含义 |
|---|---|
| IS | 打算加行共享锁 |
| IX | 打算加行排他锁 |
作用:
快速判断“表里是否有行被锁”
事务A:锁行1 → 等行2
事务B:锁行2 → 等行1
✅ 数据库会:
| 隔离级别 | 锁行为 |
|---|---|
| READ UNCOMMITTED | 几乎无锁 |
| READ COMMITTED | 行锁 |
| REPEATABLE READ(MySQL默认) | 行锁 + 间隙锁 |
| SERIALIZABLE | 强锁,性能低 |
如果你愿意,我也可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。