SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
22.
DBのロックについて(3)
行ロックの挙動 ※ 例は全てMySQL5.1系で検証
例1: 存在するレコードを行ロックした場合
SELECT * FROM t WHERE c = 2 FOR UPDATE
Gap(Infimum)
DELETE FROM t WHERE c = 2
1
Gap
×
2 L
Gap
5
× INSERT INTO t (c) VALUE(2)
Gap(supremum)
参考: ・インフィニットループ社内勉強会資料 佐々木 亨基 MySQL InnoDB によるロック処理入門 ※近日公開予定
・技術評論社 奥野幹也 著 エキスパートのためのMySQL運用+管理トラブルシューティングガイド
23.
DBのロックについて(4)
ギャップロックの挙動
例2: 存在しないレコードを行ロックした場合
SELECT * FROM t WHERE c = 4 FOR UPDATE
Gap(Infimum)
SELECT * FROM t WHERE c = 3
1
FOR UPDATE
Gap
○
2
× INSERT INTO t (c) VALUE(3)
×
Gap L
5 INSERT INTO t (c) VALUE(4)
Gap(supremum)
レコードが存在しないため、ギャップがロックされる
レコードが存在しないため、ギャップがロックされる
しないため
24.
DBのロックについて(5)
デッドロックの挙動
二つ以上のセッションが互いの処理待ちとなり、各セッションの処理が進まなくなった状態
例3: ロックして存在確認後、レコードがなければインサートする
※ t に c < 200 のデータしか無い場合
A B
SELECT * FROM t WHERE c = 200 FOR UPDATE
SELECT * FROM t WHERE c = 300 FOR UPDATE
INSERT INTO t (c) VALUE(200)
INSERT INTO t (c) VALUE(300)
これがデッドロックになる
25.
ロック処理のコツ
・ MySQLのロック処理は複雑で、新米プログラマを含めた全員が、
完全に理解するのは難しい(INSERTが絡むと特に複雑)
・ 基本指針を示し、難しい箇所はリードエンジニアがレビューで対応
・ 基本は、「トランザクション開始後に、すぐ更新対象をロック」
・ ロック時にインデックスが使用されていることをEXPLAINで確認
・ 値を加算/減算をするときは、なるべくSQLの中で行う
→ UPDATE example_tbl SET a = a + 1 WHERE foo = ‘bar’;
とても書き切
・ ロックで取ったもの以外、値が正しいことを信じない れないので、
→ スレイブ遅延やファントムリードに気をつける 近日中に弊社
技術ブログで
・ デッドロックは、ロック範囲の見直しと、リトライで対処する 別途資料を
公開予定
・ MySQLの気持ちになって考えるのが大事