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
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
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
280
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
83
JAWS ミート 2026 の「出し物」のゲームを Kiro と AI-DLC v2 で作った話
hmatsu47
PRO
0
15
ゲームで挑戦!VPC の気持ちになって IPv4/v6 パケットをルーティングしよう!
hmatsu47
PRO
0
29
続・名古屋城とデータセンター
hmatsu47
PRO
0
28
【再演】IPv6 VPC の実装パターンをいくつか
hmatsu47
PRO
0
33
名古屋城とデータセンター
hmatsu47
PRO
0
40
IPv6 に関する話
hmatsu47
PRO
0
29
さいきんの光ファイバーの話
hmatsu47
PRO
0
76
低いほうのレイヤを見てみる話
hmatsu47
PRO
0
35
Other Decks in Technology
See All in Technology
Railsのように考える: See through the Master
snoozer05
PRO
1
450
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
130
SREは、MCPとAutopilotをこう使え!
kazumax55
2
760
SQL文一行も書けない人事がCortexもろもろを使って人事業務を楽にしてみる
ponponmikankan
1
240
安心して変更できるWebフロントエンドの作り方
pirosikick
4
2.3k
あるけみー式LTスライド作成術
alchemy1115
1
210
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
160
絵ではじめるKubernetesセキュリティ
aoi1
3
520
30座EKS, 180次升級淬煉的EKS Upgrade Skill 的歷程
eric8230
0
150
空間オーディオで過去の 自分(ゴースト)と競うランニング 〜HealthKitのルートを足音に変える実装〜
nao_randd
0
200
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
230
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
2
1.7k
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.9k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
280
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
HDC tutorial
michielstock
2
870
Everyday Curiosity
cassininazir
0
320
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
240
Abbi's Birthday
coloredviolet
3
10k
Documentation Writing (for coders)
carmenintech
77
5.5k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
350
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
Raft: Consensus for Rubyists
vanstee
141
7.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
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