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
ゲームで体感!Aurora DSQL の OCC(楽観的同時実行制御)
Search
hmatsu47
PRO
July 05, 2025
Technology
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ゲームで体感!Aurora DSQL の OCC(楽観的同時実行制御)
JAWS ミート 2025
2025/7/5
hmatsu47
PRO
July 05, 2025
More Decks by hmatsu47
See All by hmatsu47
JAWS ミート 2026 の「出し物」のゲームを Kiro と AI-DLC v2 で作った話
hmatsu47
PRO
0
3
ゲームで挑戦!VPC の気持ちになって IPv4/v6 パケットをルーティングしよう!
hmatsu47
PRO
0
25
続・名古屋城とデータセンター
hmatsu47
PRO
0
24
【再演】IPv6 VPC の実装パターンをいくつか
hmatsu47
PRO
0
29
名古屋城とデータセンター
hmatsu47
PRO
0
38
IPv6 に関する話
hmatsu47
PRO
0
28
さいきんの光ファイバーの話
hmatsu47
PRO
0
68
低いほうのレイヤを見てみる話
hmatsu47
PRO
0
31
IPv6 VPC の実装パターンをいくつか
hmatsu47
PRO
0
53
Other Decks in Technology
See All in Technology
Flutter × BLE Centralを自前Pluginで実装する設計パターン - MethodChannel / EventChannelで作る双方向ブリッジの実践 / Building Custom Flutter BLE Central Plugins: Bidirectional Bridging with Method & Event Channels
bitkey
PRO
0
230
Rust×eBPFでEDRっぽいものをつくる
sunlife3
2
830
AI for Science時代を切り開く、政府の次世代HPC戦略の展望
gpuunite_official
0
210
あなたの知らないバージョン命名規則
sat
PRO
2
170
AIに持続⼒を与える 判断の⻑期記憶設計
eiei114
1
650
形式手法特論:Hyperproperty とモデル検査 #kernelvm / Kernel VM Study Tokyo 19th
ytaka23
0
660
8bit CPU 2026
koba789
6
2.6k
What's new in Go 1.27?
ciarana
0
300
AWS Blocks が楽しい #ゆるWeb札幌
tacck
PRO
0
100
RapidCopy2 Matrix I/Oエンジンによるファイルコピーソフトウェアの設計と実装
kengosawa2
1
290
関東Kaggler会発表資料
takoi
1
280
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
170
Featured
See All Featured
Done Done
chrislema
186
16k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
We Are The Robots
honzajavorek
0
310
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Navigating Weather and Climate Data
rabernat
0
490
BBQ
matthewcrist
89
10k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
We Have a Design System, Now What?
morganepeng
55
8.3k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
WCS-LA-2024
lcolladotor
0
800
Transcript
ゲームで体感! Aurora DSQL の OCC (楽観的同時実行制御) JAWS ミート 2025 2025/7/5
まつひさ(hmatsu47)
自己紹介 松久裕保(@hmatsu47) • https://qiita.com/hmatsu47 • 現在: ◦ 名古屋で Web インフラのお守り係をしています
◦ SRE チームに所属しつつ技術検証の支援をしています ◦ 普段カンファレンス・勉強会では DB の話しかしていません (ほぼ) 2
本日の内容 • Aurora DSQL おさらい ◦ 今年の 5/27 に GA
▪ 東京・大阪でシングルリージョン構成をリリース • OCC(楽観的同時実行制御)おさらい ◦ 通常の RDBMS(PCC)との違い • ゲームで確かめよう! • 答え合わせ 3
Aurora DSQL おさらい 4
サーバーレス分散 SQL データベース 5 • PostgreSQL ワイヤープロトコル互換 ◦ psql コマンドが使える
• シングルリージョン構成とマルチリージョン構成がある ◦ マルチリージョン構成は US 3 リージョン/欧州 3 リージョン/ 東京+大阪+ソウルの組み合わせでサポート ▪ エンドポイントは 2 リージョン、残り 1 つは Witness リージョンで構成
国内のみでつくるならシングルリージョン構成 6 引用元 : https://aws.amazon.com/jp/blogs/news/introducing-amazon-aurora-dsql/
それぞれの階層で負荷等に合わせて水平スケール 7 引用元 : https://aws.amazon.com/jp/blogs/news/introducing-amazon-aurora-dsql/ AWS Summit Japan 2025 AWS-43
資料より
OCC おさらい 8
シャーディングを使わずにスケールする…? • 楽観的同時実行制御(OCC)を採用 ◦ 一般の RDBMS は悲観的同時実行制御(PCC)を採用 ▪ ロック機構を使う ◦
OCC ではロックを使わない ▪ コミット時に他のトランザクションとの更新競合を検知したらアボート ▪ アボート後必要に応じてリトライ処理(アプリケーション側で実装) ◦ ロックしないので他のトランザクションを待たせることがない ▪ ただし更新競合が頻発するとアプリケーションの性能が下がる欠点がある 9
トランザクション A トランザクション B テーブル X の id = 1
の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行ロック獲得成功 (11) (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行ロック獲得待ち コミット(COMMIT)→成功 (↑行ロック獲得待ち) 11 id = 1 の行ロック獲得成功 (12) (別の処理を実行) コミット(COMMIT)→成功 12 例 [1] 通常の RDBMS(PCC / READ COMMITTED) 10
トランザクション A トランザクション B テーブル X の id = 1
の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→成功 (別の処理を実行) 11 コミット(COMMIT) →失敗・アボート 例 [2] Aurora DSQL(OCC / SNAPSHOT ISOLATION) 11 必要ならリトライする
トランザクション A トランザクション B テーブル X の id = 1
の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→?? ?? コミット(COMMIT)→?? ?? さて問題です 12 成功するのはどっち? どちらかの タイミングで 11 に
ゲームで 確かめよう! 13
「最後にコミットした人が勝ち!」ゲーム • https://dsql.hmatsu47.nagoya/ または • https://bit.ly/4nxEYrw • 1. 最初に名前を登録 14
「最後にコミットした人が勝ち!」ゲーム • https://dsql.hmatsu47.nagoya/ または • https://bit.ly/4nxEYrw • 2. ゲームが始まったら制限時間内に攻撃ボタンを押す ◦
押すと DSQL 上のテーブル行を UPDATE → 1 秒待つ→ COMMIT ◦ 同時に複数の人が攻撃した場合、COMMIT が成功した人が勝ち ▪ 勝つと UPDATE → COMMIT の待ち時間が 1 秒増える(最大 5 秒まで) ▪ 負けると 1 秒にリセット 15
「最後にコミットした人が勝ち!」ゲーム • https://dsql.hmatsu47.nagoya/ または • https://bit.ly/4nxEYrw • 3. 攻撃ボタンは時間内に何度押しても OK
• 4. 制限時間内で一番最後に COMMIT した人が優勝! ◦ ボタンを押した後の COMMIT が制限時間外なら攻撃失敗 16
答え合わせ 17
トランザクション A トランザクション B テーブル X の id = 1
の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→?? ?? コミット(COMMIT)→?? ?? もうお分かりですね? 18 成功するのはどっち? どちらかの タイミングで 11 に
トランザクション A トランザクション B テーブル X の id = 1
の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→成功 11 コミット(COMMIT)→失敗 答え 19 成功するのは B!(コミットまでの所要時間が長いトランザクションが不利) こちらの タイミングで 11 に
トランザクション A トランザクション B テーブル X の id = 1
の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→成功 11 コミット(COMMIT)→失敗 答え 20 成功するのは B!(コミットまでの所要時間が長いトランザクションが不利) こちらの タイミングで 11 に 最初の更新から コミットまでの 所要時間の長さ
ロックしないので 21 「BEGIN / UPDATE が A のほうが先だから」という理由で A を優先するのであれば、
B はここで失敗することになる(A のコミットを待たずに B を失敗させるしかない) トランザクション A トランザクション B テーブル X の id = 1 の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→成功 11 コミット(COMMIT)→失敗
ところが 22 A のコミットを待たないのに B が失敗するのであれば、後でコミットした A が 何らかの理由で失敗した場合、結果的に A
も B も失敗することになる→ TPS 低下 トランザクション A トランザクション B テーブル X の id = 1 の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→成功 11 コミット(COMMIT)→失敗
トランザクション A トランザクション B テーブル X の id = 1
の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→成功 11 コミット(COMMIT)→失敗 一方で、トランザクションの一貫性を保つには 23 B も A も成功なら最終的に値が 12 になる必要があるがそうならない
つまり • 先に COMMIT した者勝ち! ◦ 先に BEGIN しても INSERT
/ UPDATE しても関係なし ◦ 結果として無用な待ち時間が発生せず、一貫性も保たれる 24
Aurora DSQL は 特性を理解して 正しく使いましょう! 25