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
55
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.
中途セールス職_会社説明資料
livesense
PRO
0
3
EM候補者向け転職会議説明資料
livesense
PRO
0
9
コロナで失われたノベルティ作成ノウハウを復活させた話
livesense
PRO
0
82
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
PRO
0
370
転職会議でGPT-3を活用した企業口コミ要約機能をリリースした話
livesense
PRO
0
1.1k
株式会社リブセンス マッハバイト_プレイブック
livesense
PRO
0
430
Tech Award 2021 選出方法
livesense
PRO
0
1k
株式会社リブセンス エンジニアリング組織を支える風土と制度
livesense
PRO
0
540
株式会社リブセンス・マッハバイト 採用候補者様向け資料
livesense
PRO
0
210
Other Decks in Technology
See All in Technology
データベース03: 関係データモデル
trycycle
0
110
Rustで「プリズモイダル法」を利用して「土量計算」をガチでやる
nokonoko1203
1
360
QAエンジニアが伝えたい品質保証の羅針盤 / Compass for Quality Assurance
mii3king
1
190
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
0
1.9k
障害対応をちょっとずつよくしていくための 演習の作りかた
heleeen
1
1.9k
認知症フレンドリーテックとスタックチャン
naokiuc
0
380
MixIT 2024 - Pulumi : Gérer son infra avec son langage de programmation préféré
ju_hnny5
1
130
Gemini, Google's Large Language Model
glaforge
0
120
.NET Profiler in 2024.
kkamegawa
2
2.6k
自己改善からチームを動かす! 「セルフエンジニアリングマネージャー」のすゝめ
shoota
6
1.1k
TailwindCSSでUIライブラリを作る際のハマりどころ
shuta13
0
120
しくじり先生、PharmaXのLLMアプリケーション開発の失敗を語る
pharma_x_tech
0
140
Featured
See All Featured
Music & Morning Musume
bryan
41
5.6k
4 Signs Your Business is Dying
shpigford
176
21k
Building Flexible Design Systems
yeseniaperezcruz
320
37k
Embracing the Ebb and Flow
colly
80
4.2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
126
32k
Building Applications with DynamoDB
mza
88
5.6k
Testing 201, or: Great Expectations
jmmastey
30
6.4k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.7k
Ruby is Unlike a Banana
tanoku
96
10k
Done Done
chrislema
178
15k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
34
6.1k
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
次回は... 決戦!モナド