MySQLでのトランザクションは、デフォルトが自動的に送信されている自動コミット= 1;
しかし、その後、いくつかのケースでは問題があるでしょう。例えば:
あなたは一度だけ1000年のデータを挿入したい場合は、MySQLは、回をcommit1000ます
私たちは自動コミットした場合、[自動コミット= 0]、プログラムによって制御される限り、最初にそれにコミットするようなので、また、より良い業務の特性を反映させるために閉鎖!
ような量、回数などの値を、動作させるための必要性!
3つのアップデートを宣告ロック2:1つの原則を忘れないでください
MySQLのInnoDB内で、プリセットTansaction分離レベルが反復読み取られる(再読み込みすることができます)
読書中のロックSELECT二つの主な方法があります。
を共有•MODE SELECT ... LOCK
•SELECT ... FOR UPDATEが
トランザクション(トランザクション)の両方の方法は、同じデータテーブルにSELECTの中にあったときにのみ実行した後、あなたが提出され、他の取引データ(コミット)を待たなければなりません。
主な違いは、共有モードでLOCKは、フォームとの取引への一方の当事者が、デッドロックが発生する可能性が高い更新したときにということです。
同じフォームを更新するために、後者を選択した場合は簡単に言えば、それは、SELECT ... FOR UPDATEを使用するのが最適です。
例えば:
注文は、その後、確立しだけにして数1に更新された前に商品の製品の形で記憶された商品の数量の数があると、最初に十分な量の量(量> 0)か否かを決定しなければなりません。コードは以下の通りであります:
ID = 3製品からの数量を選択します。UPDATE製品は、ID = 3量= 1を設定します。
なぜそれが危険なのですか?
おそらく、少量の条件の下では問題ありませんが、データアクセスの多くは、「確かに」間違って行きます。私たちは、プログラムの最初の行は、量は2である読出し選択、それは数字が間違っていないように見えますが、MySQLは時間を更新するために準備されている場合、一部の人は、在庫のバックルを有することができると仮定して、量> 0で在庫をバックルする必要がある場合0に、しかしプログラムは知らなかった、それは、UPDATE行くの間違っているだろう。したがって、トランザクションが読み取りおよび提出されたデータが正しいことを確認するための機構を通過しなければなりません。
だから我々は、MySQL、コードでこれをテストすることができ、次のとおりです。
SETのAUTOCOMMIT = 0; 作業を開始。UPDATEのID = 3製品からの数量を選択します。
ID = 3のデータがロックされているこの製品のデータでトランザクションを使用すると、その数量を確保することができるようにUPDATE FOR ID = 3は、他の事項に読ん製品SELECT * FROMをコミットした後、他のトランザクションを実行するのを待つ必要があります(注3)数字が正しいです。
UPDATE製品は= '1' WHERE ID = 3量を設定します。COMMIT WORKを。
データベースへの提出(コミット)、ロックを解除製品。
•注1:トランザクションの開始点と終了点のためのBEGIN / COMMIT、MySQLのコマンドウィンドウを使用することができる二つ以上のロック状態の相互作用を観察します。
•注2:取引では、データのみの同じ総和中に実行される他のトランザクションの終了後まで待ちます共有モードでUPDATEまたはLOCK SELECT ... FOR、一般的にこの影響を受けません...]を選択します。
•注3:InnoDBのデフォルトは行レベルロックであるので、ロックデータがこの列を参照することができます。
•注4:InnoDBはLOCK TABLESを使用するためにあなたが最後に使用したい場合はInnoDBのフォームは、LOCK TABLESコマンドを使用しないでください、公式の説明を参照してください、そして、システムのデッドロックが頻繁に発生することは避けてください。
UPDATE的行ロック与表ロックのMySQLのSELECT ...
UPDATEの使用SELECT ... FOR上で紹介したが、ロック(ロック)のデータは、差別はメモを取る必要がありますです。InnoDBのデフォルトは指定された主キーには、これだけ「クリア」行レベルロックで、MySQLは(選択されたデータのみをロック)行ロックを行いますので、それ以外の場合は、MySQLが全体のデータフォームをロックするには、表ロックを(実行します)。
例えば:
二つの形式の製品があると仮定し、名前を持つ2つのフィールドのIDがあり、idが主キーです。
実施例1:(明示的に主キーを指定し、データを有し、行ロック)
SELECT * FROM製品WHEREのid = UPDATE FOR 3 '';
実施例2:(主キー、テーブルロック)
UPDATE FOR名= 'マウスの製品SELECT * FROM。
例3:(主キーは、テーブルロック明確ではありません)
SELECT * FROM製品WHERE ID <> '3' UPDATE FOR;
実施例4:(主キーは、テーブルロック明らかではないが)
ID LIKE '3' UPDATE FOR製品SELECT * FROM。
楽観と悲観的ロック戦略
悲観的ロック:数行をロックし、これらの行のいくつかの他の更新プログラムは、データを読み取る際に悲観的ロックの終わりまで継続する必要があります。
楽観は:データを読み取る際には、現在の更新をキャンセルする場合、更新は、データが更新されたかどうかを確認するためにロックしない、時間を待っている一般的な悲観的ロックが長すぎると、我々は楽観的ロックを選択することを受け入れることはできません。