MySQLオートロック

8997 ワード

最近ではMySQLが持つautoincrement関数を発信器として使用していることが多く、実際の使用ではコンカレントが小さい場合は問題なく、コンカレントが増えると多くの問題が発生することがありますので、以下にまとめます.
一、自増配置
次のように表文を作成することで、自己増加の構成を完了できます.
CREATE TABLE `test_inc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二、自己増加サイズの修正
次のsqlを使用して、数値を自動的に生成します.
insert into test_inc values();

3行を追加すると、テーブルのデータは次のようになります.
+----+| id |+----+| 1 || 2 || 3 |+----+
CREATE TABLE `test_inc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

alter table test_の使用inc auto_increment=10;自増を10に変更する再度挿入するデータは10とする.
+----+| id |+----+| 1 || 2 || 3 || 10 || 11 |+----+
三、自増幅
自動増幅auto_を通過increment_offsetとauto_increment_incrementという2つのパラメータで制御
set global auto_increment_increment=2;

set global auto_increment_offset=2;

set session auto_increment_increment=2;

set session auto_increment_offset=2;

偶数の自己増加を生成
set global auto_increment_increment=2;

set global auto_increment_offset=1;

set session auto_increment_increment=2;

set session auto_increment_offset=1;

奇数の自己増加を生成
auto_increment_offsetは開始数字を表します
auto_increment_incrementは異動幅を表す(すなわちn個の数字を増加するたびに、2は毎回+2を表す)
四、最後の数字を得る
last_を使用することでinsert_id()関数は最後に挿入された数値を得ることができる
select last_insert_id();

五、オートロック
自己増加フィールドが存在する場合、MySQLは自己増加ロックを維持します.自己増加ロックに関連するパラメータは(5.1.22以降に追加)です.
innodb_autoinc_lock_mode:3つの値を設定できます.0,1,2
0:traditonal (        )



1:consecutive (        ,simple insert       ,      )



2:interleaved (    ,       ,    )

ps:このパラメータ値はInnoDBエンジンの設定を制御し、すべてのMyisamはtraditonalであり、毎回テーブルロックが行われます.しかしInnodbはパラメータ不通2に応じて不通のロックを発生する.現在、MySQLのデフォルト設定は1です.
六、自己増加の過程
1つ目は、空の値を挿入するとき
innodb_autoinc_lock_mode=0の場合
1、  AUTO_INC 



2、     AUTO_INCREMENT n,  1



3、      ,  n          。



4、  AUTO_INC 。

2つ目は、すでに値がある自己増加を挿入することです.
 
123、    ,  AUTO_INC 



4、  set_max  ,  AUTO_INCREMENT



5、    ,  AUTO_INC 

 
七、存在する問題
1、コピーの問題
innodb_autoinc_lock_mode=2の場合は1つの割当であるため、replicationモードがSBRの場合、Bulk insertsが発生すると割当時に他のinsertに割当て主従が一致しない場合があるが、RBRに変更するとこのような場合はない.
つまりRBRモードではinnodb_autoinc_lock_mode=2は安全ですが、その他の場合は1に設定することをお勧めします.
2、load dataの問題
load data文を使用する場合、innodb_autoinc_lock_mode=1も0に劣化します.これは、データの一貫性を保証するためです.まず、load dataの実行手順について説明します.メインライブラリではload dataが元のSQL文であり、ライブラリからファイルを転送してtmpで一時的な問題を生成し、load data文を実行します.プライマリ・ライブラリとスレーブ・ライブラリの自己増加IDの一貫性を保証するためにbinlogにset insert_があります.IDコマンドは、このload文の最初の行の自己増加ID値を明記し、テーブルロックの場合、一貫性を保証します.
八、insertの補足説明
1.“INSERT-like”:



INSERT, INSERTSELECT, REPLACE, REPLACESELECT, and LOAD DATA, INSERTVALUES(),VALUES()



2.“Simple inserts”



      insert           insert  , INSERT, INSERTVALUES(),VALUES()



3.“Bulk inserts”



      insert           insert  , INSERTSELECT, REPLACESELECT, LOAD DATA



4.“Mixed-mode inserts”



INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');



INSERTON DUPLICATE KEY UPDATE

 
九、公式リンク
http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_autoinc_lock_mode