“数据库插入时锁表”是生产环境中很常见的问题,通常表现为:执行 INSERT 时,其他读写操作被阻塞,甚至整个表像“卡死”了一样。下面从原因 → 排查 → 解决 → 预防四个层面说明。
LOCK TABLES table_name WRITE;
或某些框架/脚本里手动加锁未释放。
BEGIN;
INSERT INTO t VALUES (...);
-- 忘记 COMMIT / ROLLBACK
未提交的事务会一直持有锁,尤其是:
插入子表时,会对父表加共享锁。
如:
ALTER TABLE ...
会阻塞 INSERT。
SHOW PROCESSLIST;
SELECT * FROM performance_schema.data_lock_waits;
SHOW ENGINE INNODB STATUS;
SELECT * FROM information_schema.INNODB_TRX;
KILL <thread_id>;
如果是自己测试:
COMMIT;
-- 或
ROLLBACK;
SHOW TABLE STATUS LIKE 'table_name';
❌ 错误:
BEGIN;
-- 循环插入 10 万条
COMMIT;
✅ 正确:
INSERT INTO t VALUES (...),(...),(...);
或每 1000 条提交一次。
INSERT IGNORE INTO t VALUES (...);
| 数据库 | 插入锁特点 |
|---|---|
| MySQL InnoDB | 行锁为主,事务未提交会阻塞 |
| MySQL MyISAM | 表锁,插入即锁表 |
| PostgreSQL | 一般并发好,长事务也会阻塞 |
| Oracle | 行锁,锁等待明显 |
你可以补充:
我可以直接帮你定位是哪一类锁问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。