温馨提示×

温馨提示×

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

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

SQL锁机制是什么原理

发布时间:2026-09-16 13:08:20 来源:亿速云 阅读:96 作者:小樊 栏目:数据库

SQL 锁机制是数据库用来保证并发操作正确性和数据一致性的一套控制机制。其核心原理可以概括为:

在并发访问数据时,通过“加锁”限制其他事务对数据的操作,从而避免脏读、不可重复读、幻读和数据竞争。

下面从原理、分类、实现和典型问题几个层面说明。


一、为什么需要锁(原理背景)

当多个事务同时:

  • 读数据
  • 改数据
  • 读写混合

如果不加控制,会出现问题:

  • 脏读:读到未提交的数据
  • 不可重复读:同一事务内两次读结果不同
  • 幻读:插入导致结果集变化
  • 丢失更新:两个修改互相覆盖

锁的作用就是:在合适的时间、对合适的数据、加合适的锁


二、锁的基本思想

数据库在访问数据前:

  1. 先申请锁
  2. 如果锁冲突 → 等待或报错
  3. 事务结束(提交/回滚) → 释放锁

简化模型:

事务A ──加锁──> 数据
事务B ──请求锁──> 阻塞 / 拒绝

三、按“锁粒度”分类(锁什么)

1. 行锁(Row Lock)

  • 锁一行记录
  • 并发高,开销大
  • 如:MySQL InnoDB
UPDATE user SET age=18 WHERE id=1;

2. 表锁(Table Lock)

  • 锁整张表
  • 并发低,开销小
  • 如:MyISAM
LOCK TABLES user WRITE;

3. 页锁(Page Lock)

  • 锁数据页(介于行和表之间)
  • 如:SQL Server

四、按“锁模式”分类(怎么锁)

1. 共享锁(S锁 / Read Lock)

  • 多人可同时读
  • 不能写
SELECT * FROM user LOCK IN SHARE MODE;

2. 排他锁(X锁 / Write Lock)

  • 只能一个事务持有
  • 不能读也不能写
SELECT * FROM user FOR UPDATE;

3. 意向锁(Intention Lock)

  • 表级锁,表示“我要锁行”
  • 提高效率,避免逐行检查

五、按“时间维度”分类

1. 悲观锁(Pessimistic Lock)

假设一定会冲突

  • 操作前就加锁
  • 适合写多场景
SELECT ... FOR UPDATE;

2. 乐观锁(Optimistic Lock)

假设很少冲突

  • 不加锁
  • 提交时检查版本
UPDATE user SET age=19, version=2
WHERE id=1 AND version=1;

六、事务隔离级别与锁的关系

隔离级别 锁策略
Read Uncommitted 几乎不加锁
Read Committed 语句级锁
Repeatable Read 事务级锁
Serializable 强锁 / 范围锁

七、典型锁问题

1. 死锁

两个事务互相等待:

A 等 B 的锁
B 等 A 的锁

解决:

  • 超时回滚
  • 固定加锁顺序

2. 锁等待

  • 一个事务长时间不提交
  • 其他事务阻塞

八、一句话总结

SQL锁机制的本质是:通过“限制并发访问”来换取“数据一致性”,在性能与正确性之间做平衡。

如果你愿意,我可以用 MySQL / Oracle / PostgreSQL 的具体例子,或者画一张锁冲突示意图来解释。

向AI问一下细节

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

AI