简短结论:普通的 INNER JOIN 本身不会“锁整张表”,但是否加锁、加什么锁、锁的范围,取决于数据库类型、事务隔离级别、是否走索引、是否涉及数据修改。
下面按常见情况说明。
例如:
SELECT a.id, b.name
FROM A a
INNER JOIN B b ON a.id = b.aid;
在 MySQL / PostgreSQL / SQL Server 中:
UPDATE A a
INNER JOIN B b ON a.id = b.aid
SET a.flag = 1
WHERE b.status = 0;
这时:
| 数据库 | INNER JOIN 锁表吗 |
|---|---|
| MySQL InnoDB | ❌ 默认行锁 |
| MySQL MyISAM | ✅ 写会表锁 |
| PostgreSQL | ❌ MVCC,几乎不锁 |
| SQL Server | ❌ 行/页锁(看执行计划) |
| Oracle | ❌ 行级锁 |
✅ 建议:
SERIALIZABLEINNER JOIN 不会主动锁表,锁不锁、锁多少,取决于“是否写数据 + 是否走索引 + 数据库引擎”。
如果你能告诉我:
我可以给你更精确的锁分析。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。