mysql 是如何保證在高並發的情況下autoincrement關鍵字修飾的列不會出現重復


轉載自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8
mysql實現這個機制的背后,主要有兩種方式

  1. 采用 AUTO-INC 鎖,也就是在執行插入語句時,就在表級別上加一個AUTO-INC鎖。然后,為每條待插入記錄的AUTO_INCREMENT修飾的列分配遞增的值。在該語句執行完成之后,再把AUTO-INC鎖釋放掉。需要注意的是,在釋放鎖的時候,不同於一般情況下的讀鎖和寫鎖,是在事務執行完成之后自動釋放鎖。AUTO-INC鎖是在當前語句插入完成之后釋放的。
  2. 采用一個輕量級的鎖,在為插入語句生成AUTO_INCREMENT修飾的列分配遞增的值時獲取該鎖,在數值分配完成后就釋放該鎖。所以采用這種方式的話,必須清楚該插入語句具體的插入數量。同時,這種方式避免鎖表,所以,效率較高。

我們可以執行

SHOW VARIABLES LIKE '%innodb_autoinc_lock_mode%';

這條sql語句,查看我們本地的mysql數據庫服務器是采用的那種方式
若值為0,AUTO-INC鎖方式;
若值為1,輕量級鎖方式;
若值為2,兩種方式混着來(就是插入記錄數量確定的情況下使用輕量級鎖,不確定時采用AUTO-INC鎖方式)。

tips:
采用輕量級鎖時,可能會造成不同事務中,插入語句生成的數值是交叉的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM