**自增锁(AUTO-INC Lock)**是数据库中用于保证 自增列(AUTO_INCREMENT) 唯一性和连续性的一种锁机制,最常见于 MySQL / InnoDB。下面从原理、类型、演变和实际影响来讲。
当表中有 AUTO_INCREMENT 列时:
CREATE TABLE t (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(10)
);
多个事务并发插入时,必须保证:
如果没有锁,两个事务可能同时拿到同一个自增值,导致主键冲突。
在生成自增值的瞬间加锁,分配完成后释放
不同插入方式,加锁粒度不同。
INSERT 开始INSERT 语句结束(不是事务结束)INSERT INTO t(name) VALUES ('a');
特点:
从 MySQL 5.1+ 开始优化:
INSERT INTO t(name) VALUES ('a'), ('b'), ('c');
特点:
| 模式 | 名称 | 特点 |
|---|---|---|
| 0 | traditional | 表锁,最安全 |
| 1 | consecutive(默认) | 批量预分配,性能好 |
| 2 | interleaved | 无自增锁,性能最高(主从可能不一致) |
MySQL 8.0 默认是 2(interleaved),但要求 ROW 格式 binlog
INSERT 失败 / 回滚
自增值 不会回退:
1, 2, 3, (失败) → 下一个是 5
原因:
⚠️ 重要:
在 STATEMENT binlog 下:
✅ 解决方案:
ROW binloginnodb_autoinc_lock_mode = 1自增锁的本质是:在并发插入时,用最小代价的锁保证 AUTO_INCREMENT 值不冲突,而不是保证绝对连续或事务一致。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。