Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
lock in depth #TechLunch
Search
Livesense Inc.
PRO
April 23, 2014
Technology
0
67
lock in depth #TechLunch
2012/04/04(水) @ Livesense TechLunch
発表者:桂 大介
Livesense Inc.
PRO
April 23, 2014
Tweet
Share
More Decks by Livesense Inc.
See All by Livesense Inc.
27新卒_総合職採用_会社説明資料
livesense
PRO
0
390
27新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
0
3.9k
株式会社リブセンス・転職会議 採用候補者様向け資料
livesense
PRO
0
85
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
PRO
0
1.6k
データ基盤の負債解消のためのリプレイス
livesense
PRO
0
480
26新卒_総合職採用_会社説明資料
livesense
PRO
0
12k
株式会社リブセンス会社紹介資料 / Invent the next common.
livesense
PRO
1
43k
26新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
1
13k
中途セールス職_会社説明資料
livesense
PRO
0
270
Other Decks in Technology
See All in Technology
ざっくり学ぶ 『エンジニアリングリーダー 技術組織を育てるリーダーシップと セルフマネジメント』 / 50 minute Engineering Leader
iwashi86
8
4k
プロダクト開発と社内データ活用での、BI×AIの現在地 / Data_Findy
sansan_randd
1
730
次世代のメールプロトコルの斜め読み
hirachan
1
190
サブドメインテイクオーバー事例紹介と対策について
mikit
2
350
re:Invent 2025の見どころと便利アイテムをご紹介 / Highlights and Useful Items for re:Invent 2025
yuj1osm
0
530
GTC 2025 : 가속되고 있는 미래
inureyes
PRO
0
140
AWS re:Invent 2025事前勉強会資料 / AWS re:Invent 2025 pre study meetup
kinunori
0
960
ゼロコード計装導入後のカスタム計装でさらに可観測性を高めよう
sansantech
PRO
1
610
AI機能プロジェクト炎上の 3つのしくじりと学び
nakawai
0
180
累計5000万DLサービスの裏側 – LINEマンガのKotlinで挑む大規模 Server-side ETLの最適化
ldf_tech
0
110
境界線が消える世界におけるQAエンジニアのキャリアの可能性を考える / Considering the Career Possibilities for QA Engineers
mii3king
2
110
Azure Well-Architected Framework入門
tomokusaba
1
150
Featured
See All Featured
A better future with KSS
kneath
239
18k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Fireside Chat
paigeccino
41
3.7k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
2
210
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.2k
Docker and Python
trallard
46
3.6k
Optimizing for Happiness
mojombo
379
70k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
Become a Pro
speakerdeck
PRO
29
5.6k
Designing for Performance
lara
610
69k
Why Our Code Smells
bkeepers
PRO
340
57k
Transcript
lock in depth
[email protected]
ACID • Atomicity トランザクションが「全て実行される」か「全く実行さ れない」ことを保証する • Consistency 整合性制約を満たす • Isolation
トランザクション中の過程が他から隠蔽される • Durability トランザクションが完了したら結果は永続する
• 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
eXclusive and Shared lock • 排他/専有(X)ロックと共有(S)ロック • 共有ロック中は共有ロックのみ取得可 • 排他ロック中はどちらのロックも取得不可
• 共有ロック=読み込みロック • 排他ロック=書き込みロック
Two-phase locking(2PL) • ロックの取得と開放は2つのフェイズに分かれて いる • 取得の順番が違うとデッドロックが起こる • Expanding phase(Growing
phase) ロックが取得されていくフェイズ • Shrinking phase ロックが開放されるフェイズ
Pessimistic Lock • 悲観的ロック(悲観的並行制御) • トランザクション開始時に対象のロックを取得 • 取得出来ない場合は待つorエラー投げる • ロックを取得
• 安心して更新
Optimistic Lock • 楽観的ロック(楽観的並行制御) • トランザクション開始時のバージョン番号を取得 • ロックは特に取らない • トランザクション進める
• トランザクション終了時に開始時から更新されて いるかをチェック • 変更されていたらエラー投げる(orリトライ)
Optimistic Lock その2 • 実装はtimestampかバージョン番号 • ActiveSupportはlock_versionカラムを用意する と勝手にOptimistic Lockをかける •
cf. ActiveRecord::Locking::Optimistic • http://api.rubyonrails. org/classes/ActiveRecord/Locking/Optimist ic.html
Table-level lock • MyISAMでお馴染みテーブルロック • MEMORYもテーブルロック • 省メモリ、高速 • UPDATE,
DELETEがないときは使える
• 行ロック • ロックコンフリクトが少ない • InnoDB他メジャーなやつはだいたい行ロック • メモリを多く消費する • テーブル全体をロックするクエリが多いときはパ
フォーマンスが低い Row-level lock
Transaction Isolation Level • トランザクションが同時に実行されたときに、どれ くらい分離されるか(影響されないか) • ANSI/ISO SQL標準では4つ定められている •
Serializable • Repeatable Read • Read Committed • Read Uncommitted
Serializable • それぞれのトランザクションは逐次実行した場合 と同じ結果となる • 分離レベルは一番高い • 安全だが低性能
Repeatable Read • 同じ行のデータはトランザクション内で変更され ない • 同じ検索条件で新しい行が出てくること (Phantom Read)がある •
InnoDBのデフォルト分離レベル
Read Committed • コミット済みのデータのみ読み取る • 一度読み込んだデータをもう一度読み込むと データの内容が変更または削除されていること (Non-Repeatable Read)がある •
Phantom Readもある
Read Uncommitted • コミットされてなくても読み込む(Dirty Read) • Phantom, Non-Repeatableもある
トランザクション分離レベル Phantom Read Non- Repetable Read Dirty Read Serializable ×
× × Repeatable Read ◦ × × Read Committed ◦ ◦ × Read Uncommitted ◦ ◦ ◦
InnoDB • 分離レベルは全て対応 • デフォルトはREPEATABLE READ • 全ての接続を変更するときはmy.cnfで • SET
SESSION TRANSACTION ISOLATION LEVEL [LEVEL] でセッションのみも変更可 • SELECT @@tx_isolation; で確認
mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ
| +-----------------+ 1 row in set (0.03 sec)
InnoDB Locks • Record Lock インデックスレコードのロック • Gap Lock インデックス間、最初のインデックスの前、最後のイ
ンデックスの後ろのギャップのロック • Next Key Lock インデックスとインデックスの前のギャップの組み合 わせ
Next Key Lock DEMO
LOCK IN SHARE MODE FOR UPDATE • SELECTと同時にロックを取得 • LOCK
IN SHARE MODE は共有 • FOR UPDATEは排他
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
MVCC • MultiVersion Concurrency Control • 複数バージョンの同時並行性制御
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
次回は... 決戦!モナド