温馨提示×

温馨提示×

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

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

sql锁机制是怎样工作的

发布时间:2026-10-27 21:01:16 来源:亿速云 阅读:86 作者:小樊 栏目:数据库

SQL 的锁机制主要用于保证并发访问数据库时的数据一致性与隔离性。不同数据库(MySQL、PostgreSQL、Oracle、SQL Server)实现细节不同,但核心思想一致。下面以通用原理 + MySQL(InnoDB)为例说明。


一、为什么需要锁

当多个事务同时:

  • 读 + 写
  • 写 + 写

可能出现:

  • 脏读
  • 不可重复读
  • 幻读
  • 丢失更新

锁就是用来控制谁能在什么时间访问什么数据。


二、锁的基本分类

1️⃣ 按锁的粒度(作用范围)

锁类型 说明
行锁(Row Lock) 锁一行数据(InnoDB 支持)
表锁(Table Lock) 锁整张表(MyISAM 常用)
页锁(Page Lock) 锁一页数据(少见)

✅ InnoDB 默认使用行级锁


2️⃣ 按锁的性质(读写)

锁类型 说明
共享锁(S锁 / Read Lock) 多人可同时读
排他锁(X锁 / Write Lock) 只能一人写

规则:

  • S + S ✅
  • S + X ❌
  • X + X ❌

3️⃣ 按锁的实现方式

类型 说明
悲观锁 假设会冲突,先加锁
乐观锁 假设不冲突,提交时校验(版本号 / 时间戳)

三、InnoDB 的行锁是怎么工作的

1️⃣ 隐式加锁(自动)

UPDATE user SET age=20 WHERE id=1;
  • 自动对 id=1 加 排他锁(X)
  • 其他事务不能修改这行
SELECT * FROM user WHERE id=1;
  • 普通读:不加锁(快照读)

2️⃣ 显式加锁

-- 加共享锁
SELECT * FROM user WHERE id=1 LOCK IN SHARE MODE;

-- 加排他锁
SELECT * FROM user WHERE id=1 FOR UPDATE;

四、MVCC(多版本并发控制)

InnoDB 通过 MVCC 减少锁冲突:

  • 读不加锁(快照读)
  • 写不阻塞读
  • 靠 undo log + 事务ID 实现

✅ 所以:

  • 普通 SELECT 很快
  • 写操作互不干扰(不同行)

五、意向锁(Intention Lock)

用于表级 & 行级协调

锁 含义
IS 打算加行共享锁
IX 打算加行排他锁

作用:

快速判断“表里是否有行被锁”


六、死锁是怎么产生的

事务A:锁行1 → 等行2
事务B:锁行2 → 等行1

✅ 数据库会:

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

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

隔离级别 锁行为
READ UNCOMMITTED 几乎无锁
READ COMMITTED 行锁
REPEATABLE READ(MySQL默认) 行锁 + 间隙锁
SERIALIZABLE 强锁,性能低

八、简单总结

  • 锁 = 控制并发访问
  • InnoDB = 行锁 + MVCC
  • 写加 X 锁,读默认不加锁
  • 锁太多 → 性能差
  • 锁太少 → 数据乱

如果你愿意,我也可以:

  • 用 图 讲锁流程
  • 讲 间隙锁 / Next-Key Lock
  • 结合 具体业务场景(秒杀、库存)讲锁怎么用

你想深入哪一块?

向AI问一下细节

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

AI
助
手