“Nested Query(嵌套查询,也叫子查询 Subquery)会不会锁表,不能一概而论,取决于数据库类型、隔离级别、子查询写法、是否涉及写操作等因素。
下面分情况说清楚:
大多数主流数据库在 SELECT 子查询中:
✅ 结论:只读嵌套查询一般不会锁表
以下情况可能锁或阻塞:
FOR UPDATELOCK IN SHARE MODE示例:
UPDATE orders
SET status = 'paid'
WHERE user_id IN (
SELECT id FROM users WHERE vip = 1
);
⚠️ 风险点:
| 数据库 | 嵌套查询锁表风险 |
|---|---|
| MySQL InnoDB | ❌ 一般不会(行锁) |
| MySQL MyISAM | ✅ 会锁表(表锁) |
| PostgreSQL | ❌ 基本不会 |
| SQL Server | ⚠️ 看隔离级别 |
| Oracle | ❌ 使用 undo,不锁表 |
✅ 明确会锁表的情况:
LOCK TABLESNested Query 本身不会锁表,是否锁表取决于:数据库引擎 + 是否写操作 + 是否有索引 + 事务设计。
如果你愿意,可以告诉我:
我可以直接帮你判断“这条 SQL 会不会锁”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。