温馨提示×

温馨提示×

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

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

数据库Inner Join会锁表吗

发布时间:2026-11-02 01:43:31 来源:亿速云 阅读:92 作者:小樊 栏目:数据库

简短结论:普通的 INNER JOIN 本身不会“锁整张表”,但是否加锁、加什么锁、锁的范围,取决于数据库类型、事务隔离级别、是否走索引、是否涉及数据修改。

下面按常见情况说明。


1. 只读查询(SELECT + INNER JOIN)

✅ 大多数情况:不会锁表

例如:

SELECT a.id, b.name
FROM A a
INNER JOIN B b ON a.id = b.aid;

在 MySQL / PostgreSQL / SQL Server 中:

  • 只加 共享锁(Share Lock) 或 MVCC 读快照
  • 不会阻塞其他读
  • 不会锁整张表

例外情况(可能“像锁表”)

  1. 没走索引
    • 可能触发 全表扫描
    • 在某些隔离级别下,会锁更多行甚至表级意向锁
  2. SERIALIZABLE 隔离级别
    • 可能加范围锁(gap lock / range lock)
  3. DDL 或元数据锁
    • 比如 JOIN 时表正在被 ALTER

2. 写操作 + INNER JOIN(UPDATE / DELETE)

UPDATE A a
INNER JOIN B b ON a.id = b.aid
SET a.flag = 1
WHERE b.status = 0;

这时:

  • ✅ 不会锁整张表(InnoDB 默认)
  • ✅ 只锁 命中的行
  • ❌ 如果 JOIN 条件无索引 → 可能 锁很多行甚至接近全表

MySQL 特别注意

  • InnoDB:行锁
  • MyISAM:表锁(不管 JOIN 不 JOIN)

3. 不同数据库的差异

数据库 INNER JOIN 锁表吗
MySQL InnoDB ❌ 默认行锁
MySQL MyISAM ✅ 写会表锁
PostgreSQL ❌ MVCC,几乎不锁
SQL Server ❌ 行/页锁(看执行计划)
Oracle ❌ 行级锁

4. 如何避免“锁表感”

✅ 建议:

  • JOIN 的关联字段 必须有索引
  • 避免 SERIALIZABLE
  • 写操作尽量 缩小 WHERE 范围
  • 大表 JOIN 分批处理

总结一句话

INNER JOIN 不会主动锁表,锁不锁、锁多少,取决于“是否写数据 + 是否走索引 + 数据库引擎”。

如果你能告诉我:

  • 用的什么数据库(MySQL / PG / SQL Server)
  • 是 SELECT 还是 UPDATE
  • 表结构和索引情况

我可以给你更精确的锁分析。

向AI问一下细节

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

AI
助
手