轉載自 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:
采用輕量級鎖時,可能會造成不同事務中,插入語句生成的數值是交叉的。