在关系数据库中,“锁表”(Table Lock / Locking the whole table)通常是指数据库为了保证数据一致性、隔离性和并发安全,在操作时对整个表加锁,阻止其他事务对该表进行某些操作。
下面从原因、机制、场景几个角度说明:
核心目的:保证事务的 ACID 特性
保证数据一致性(Consistency)
保证事务隔离性(Isolation)
简化并发控制
LOCK TABLES user WRITE;
-- 或
SELECT * FROM user FOR UPDATE;
ALTER TABLE user ADD COLUMN age INT;
TRUNCATE TABLE user;
例如:
UPDATE user SET status = 1 WHERE name = 'tom';
name 没有索引:
BEGIN;
UPDATE user SET age = 20 WHERE id = 1;
-- 不提交
不同数据库差异很大:
| 数据库 | 表锁情况 |
|---|---|
| MySQL (MyISAM) | 默认表锁 |
| MySQL (InnoDB) | 行锁为主,特定情况表锁 |
| PostgreSQL | 表锁 + 行锁混合 |
| Oracle | 行锁为主,DDL 会表锁 |
不一定
SELECT ... FOR UPDATE 滥用如果你愿意,我也可以:
你可以直接贴错误信息或场景。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。