Upgrade to Pro — share decks privately, control downloads, hide ads and more …

lock in depth #TechLunch

lock in depth #TechLunch

2012/04/04(水) @ Livesense TechLunch
発表者:桂 大介

Livesense Inc.

April 23, 2014
Tweet

More Decks by Livesense Inc.

Other Decks in Technology

Transcript

  1. ACID • Atomicity トランザクションが「全て実行される」か「全く実行さ れない」ことを保証する • Consistency 整合性制約を満たす • Isolation

    トランザクション中の過程が他から隠蔽される • Durability トランザクションが完了したら結果は永続する
  2. • Exclusive lock and Shared lock • Read lock and

    Write lock • Two-Phase Locking • Optimistic lock and Pessimistic lock • Timestamp Lock • Table-level lock and Row-level lock • Multiple granularity locking • Intention lock • Next key lock • Gap lock Lock
  3. Optimistic Lock • 楽観的ロック(楽観的並行制御) • トランザクション開始時のバージョン番号を取得 • ロックは特に取らない • トランザクション進める

    • トランザクション終了時に開始時から更新されて いるかをチェック • 変更されていたらエラー投げる(orリトライ)
  4. Optimistic Lock その2 • 実装はtimestampかバージョン番号 • ActiveSupportはlock_versionカラムを用意する と勝手にOptimistic Lockをかける •

    cf. ActiveRecord::Locking::Optimistic • http://api.rubyonrails. org/classes/ActiveRecord/Locking/Optimist ic.html
  5. トランザクション分離レベル Phantom Read Non- Repetable Read Dirty Read Serializable ×

    × × Repeatable Read ◦ × × Read Committed ◦ ◦ × Read Uncommitted ◦ ◦ ◦
  6. InnoDB • 分離レベルは全て対応 • デフォルトはREPEATABLE READ • 全ての接続を変更するときはmy.cnfで • SET

    SESSION TRANSACTION ISOLATION LEVEL [LEVEL] でセッションのみも変更可 • SELECT @@tx_isolation; で確認
  7. InnoDB Locks • Record Lock インデックスレコードのロック • Gap Lock インデックス間、最初のインデックスの前、最後のイ

    ンデックスの後ろのギャップのロック • Next Key Lock インデックスとインデックスの前のギャップの組み合 わせ
  8. FOR UPDATE使わないと... 1. AがBEGIN, SELECT 2. BがBEGIN, UPDATE, COMMIT 3.

    AがUPDATE, COMMIT REPEATABLE READだとAが読むデータは3でも 変わらないが、実際データは変更されている。 →1のSELECTをFOR UPDATEにすることで2でロッ ク待ちになる SERIALIZABLEだと常にSELECTがLOCK IN SHARE MODE
  9. User A User B SET AUTOCOMMIT=0; SET AUTOCOMMIT=0; time |

    SELECT * FROM t; | empty set | INSERT INTO t VALUES (1, 2); | v SELECT * FROM t; empty set COMMIT; SELECT * FROM t; empty set COMMIT; SELECT * FROM t; --------------------- | 1 | 2 | --------------------- 1 row in set