mysql AUTO_INC 是否锁_AUTO-INC锁的一些思考
AUTO-INC鎖是一個表級鎖,這種鎖是作用于語句的而不是事務(即語句執行完了鎖就會被釋放)。innodb_autoinc_lock_mode用于控制AUTO-INC的鎖表邏輯,可能的取值為0,1,2.
innodb_autoinc_lock_mode=0?(每次都會產生表鎖)
不管是對于simple inserts(insert into values),bulk inserts(insert into select,replace select),mixed-mode inserts(insert into on deplicate key update,insert into values (1,'test'),(null,'test2'))類型的sql語句,每條sql語句都會產生auto-inc表鎖,每一次產生新的行記錄就會進行獲取一個auto_increment值。此種情況下產生的insert_id是連續的,但是并發性較差。
innodb_autoinc_lock_mode=1?(默認,可預判行數時使用新方式,不可確定數量時使用表鎖,對于simple insert會獲得批量的鎖,保證連續插入)
保證同一條insert語句中新插入的auto_increment id都是連續的,并發程度較高,這種模式下:
“simple inserts”:直接通過分析語句,獲得要插入的數量,然后一次性分配足夠的auto_increment id,只會將整個分配的過程鎖住。
“bulk inserts”:因為不能確定插入的數量,因此使用和以前的模式相同的表級鎖定。
“mixed-mode inserts”:直接分析語句,獲得最壞情況下需要插入的數量,然后一次性分配足夠的auto_increment id,只會將整個分配的過程鎖住。需要注意的是,這種方式下,會分配過多的id,而導致”浪費“。比如INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');會一次性的分配5個id,而不管用戶是否指定了部分id;INSERT ... ON DUPLICATE KEY UPDATE一次性分配,而不管將來插入過程中是否會因為duplicate key而僅僅執行update操作。
innodb_autoinc_lock_mode=2?(不會鎖表,來一個sql則處理一個,會出現多個sql產生的insert_id相互交叉的現象)
這種模式是來一個分配一個,而不會鎖表,這種方式并發性最高,只會鎖住分配id的過程,和innodb_autoinc_lock_mode = 1的區別在于,不會預分配多個,這種方式并發性最高。但是在replication中當binlog_format為statement-based時(簡稱SBR statement-based replication)存在問題,因為是來一個分配一個,這樣當并發執行時,“bulk inserts”在分配的時會同時向其他的INSERT分配,會出現主從不一致(從庫執行結果和主庫執行結果不一樣),因為binlog只會記錄開始的insert id。雖說 innodb_autoinc_lock_mode = 2 不安全,但是在binlog_format=ROW,transaction-isolation=READ-COMMITTED , innodb_autoinc_lock_mode = 2?是非常安全的。
總結
以上是生活随笔為你收集整理的mysql AUTO_INC 是否锁_AUTO-INC锁的一些思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python层次聚类法画图_Python
- 下一篇: 修改wps图文框的厚度(wps设置边框大