温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据库Lock锁是什么原理

发布时间:2026-11-02 21:30:06 来源:亿速云 阅读:96 作者:小樊 栏目:数据库

数据库中的 Lock(锁) 是用来保证 并发访问数据一致性 和 事务隔离性 的机制。它的核心原理可以概括为:在访问数据前,先申请锁;获得锁才能操作,操作完释放锁;其他线程/事务若需要冲突的锁,就必须等待。

下面从几个层次讲清楚原理。


一、为什么需要 Lock(锁)

多个事务同时操作数据库时,可能出现问题:

  • 脏读:读到未提交的数据
  • 不可重复读:同一事务内多次读结果不同
  • 幻读:同一查询条件,行数变了
  • 更新丢失:两个更新互相覆盖

锁的作用就是:控制谁能在什么时间、以什么方式访问数据。


二、Lock 的基本工作原理

1. 锁是“资源标记”

数据库把锁加在资源上,比如:

  • 行(Row Lock)
  • 页(Page Lock)
  • 表(Table Lock)
  • 索引(Index Lock)

例如:

UPDATE user SET age=20 WHERE id=1;

数据库会在 id=1 这一行上加上 排他锁(X Lock)。


2. 锁的两种基本类型

✅ 共享锁(S Lock,Shared)

  • 允许多个事务 同时读
  • 不允许多个事务 写
SELECT ... LOCK IN SHARE MODE;

✅ 排他锁(X Lock,Exclusive)

  • 只允许一个事务 写
  • 其他事务不能读也不能写
UPDATE / DELETE / INSERT

兼容性矩阵(简化)

已有锁 \ 请求锁 S X
S ✅ ❌
X ❌ ❌

3. 加锁 → 使用 → 释放(两阶段锁协议)

数据库通常遵循 2PL(Two-Phase Locking):

  1. 加锁阶段:事务中不断加锁
  2. 解锁阶段:事务提交或回滚后才释放锁
BEGIN;
加锁 → 加锁 → 操作 → 操作
COMMIT;  ← 这里才释放锁

三、行锁是怎么实现的?(以 InnoDB 为例)

1. 行锁不是“锁住那一行数据”

而是:

在索引上加锁

如果:

  • 有索引:WHERE id=1 → 锁索引记录
  • 无索引:可能 锁全表(退化成表锁)

2. 行锁的三种常见形式

(1)Record Lock(记录锁)

锁具体某一行

WHERE id = 1

(2)Gap Lock(间隙锁)

锁“两个值之间的空隙”,防止插入

WHERE age BETWEEN 10 AND 20

(3)Next-Key Lock

= Record Lock + Gap Lock
防止幻读(MySQL 默认)


四、锁等待与死锁

1. 锁等待

事务 A 持有锁,事务 B 等待:

B: 等待 A 释放锁

超时则报错:

Lock wait timeout exceeded

2. 死锁(Deadlock)

A 锁了 1,等 2
B 锁了 2,等 1

数据库会:

  • 检测死锁
  • 回滚其中一个事务

五、Lock 和事务隔离级别的关系

隔离级别 锁行为
读未提交 几乎不加锁
读已提交 行锁
可重复读 行锁 + Gap Lock
串行化 大量锁,性能低

六、一句话总结

数据库 Lock 的本质是:通过“标记资源是否被占用”,在并发环境下强制事务按顺序、安全地访问数据。

如果你愿意,我可以:

  • 用 生活例子(如卫生间锁)解释
  • 讲 MySQL / Oracle / PostgreSQL 锁区别
  • 分析 一条 SQL 到底加了什么锁

你想从哪一个角度继续?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手