Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ゲームで体感!Aurora DSQL の OCC(楽観的同時実行制御)
Search
hmatsu47
PRO
July 05, 2025
Technology
270
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
中小企業に就職して転職せず30年。結果どうなった?
hmatsu47
PRO
0
77
JAWS ミート 2026 の「出し物」のゲームを Kiro と AI-DLC v2 で作った話
hmatsu47
PRO
0
13
ゲームで挑戦!VPC の気持ちになって IPv4/v6 パケットをルーティングしよう!
hmatsu47
PRO
0
27
続・名古屋城とデータセンター
hmatsu47
PRO
0
27
【再演】IPv6 VPC の実装パターンをいくつか
hmatsu47
PRO
0
33
名古屋城とデータセンター
hmatsu47
PRO
0
39
IPv6 に関する話
hmatsu47
PRO
0
29
さいきんの光ファイバーの話
hmatsu47
PRO
0
74
低いほうのレイヤを見てみる話
hmatsu47
PRO
0
34
Other Decks in Technology
See All in Technology
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
170
enechainの内製セルフサービスプラットフォーム
hiyosi
0
150
10分で知る最近のOmarchy
komagata
0
200
生成AIのテナント制御とシャドーMCP対策 | AIを"止めずに"、情報を守る
yukun
0
140
AI時代のAPI品質を支えるガードレール / API Guardrails for API quality in the AI era
yokawasa
1
200
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
140
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
4
1k
コーディングエージェントでM5Stack系の開発を少し試した時の話 / M5 Japan Tour 2026 Autumn 東京
you
PRO
0
110
あるけみー式LTスライド作成術
alchemy1115
1
130
全員がプロダクトへ向き合う組織を持続成長させるために——組織づくりのフライホイールと4象限 / The Flywheel Model and Four Quadrants for Organizational Design
hiro_torii
4
940
薬剤師(ドメインエキスパート)と一緒に育てる薬局向けAIアシスタント
kakehashi
PRO
2
130
Snowflakeで実現する全社横断の顧客の声(VOC)分析・活用基盤@Snowflake World Tour Tokyo 2026
yuto16
0
130
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
330
Making the Leap to Tech Lead
cromwellryan
135
10k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
970
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
A Modern Web Designer's Workflow
chriscoyier
698
190k
A Soul's Torment
seathinner
7
3.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Technical Leadership for Architectural Decision Making
baasie
3
560
Testing 201, or: Great Expectations
jmmastey
46
8.3k
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