转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8
mysql实现这个机制的背后,主要有两种方式
- 采用 AUTO-INC 锁,也就是在执行插入语句时,就在表级别上加一个AUTO-INC锁。然后,为每条待插入记录的AUTO_INCREMENT修饰的列分配递增的值。在该语句执行完成之后,再把AUTO-INC锁释放掉。需要注意的是,在释放锁的时候,不同于一般情况下的读锁和写锁,是在事务执行完成之后自动释放锁。AUTO-INC锁是在当前语句插入完成之后释放的。
- 采用一个轻量级的锁,在为插入语句生成AUTO_INCREMENT修饰的列分配递增的值时获取该锁,在数值分配完成后就释放该锁。所以采用这种方式的话,必须清楚该插入语句具体的插入数量。同时,这种方式避免锁表,所以,效率较高。
我们可以执行
SHOW VARIABLES LIKE '%innodb_autoinc_lock_mode%';
这条sql语句,查看我们本地的mysql数据库服务器是采用的那种方式
若值为0,AUTO-INC锁方式;
若值为1,轻量级锁方式;
若值为2,两种方式混着来(就是插入记录数量确定的情况下使用轻量级锁,不确定时采用AUTO-INC锁方式)。
tips:
采用轻量级锁时,可能会造成不同事务中,插入语句生成的数值是交叉的。