>100 Views
August 03, 25
スライド概要
俺の勉強会 #3 2025/8/4
Qiita や Zenn でいろいろ書いてます。 https://qiita.com/hmatsu47 https://zenn.dev/hmatsu47 MySQL 8.0 の薄い本 : https://github.com/hmatsu47/mysql80_no_usui_hon Aurora MySQL v1 → v3 移行計画 : https://zenn.dev/hmatsu47/books/aurora-mysql3-plan-book https://speakerdeck.com/hmatsu47
「ゲームで体感!Aurora DSQL の OCC (楽観的同時実行制御)」の結果ログから Aurora DSQL の動作を考察する 俺の勉強会 #3 2025/8/4 まつひさ(hmatsu47)
自己紹介…はスキップ 松久裕保(@hmatsu47) ● https://qiita.com/hmatsu47 2
「ゲームで体感!Aurora DSQL の OCC」とは? ● 2025/7/5 開催 JAWS ミート 2025・LT ○ https://www.docswell.com/s/hmatsu47/ZJ977V-dsql-game-jawsmt ● Aurora DSQL は OCC(楽観的同時実行制御)を採用 ○ ロックを使わない ■ トランザクションコミット時に競合を確認(競合があればコミット不可) ○ 一般的な RDBMS(PCC 採用)とは挙動が違う→体感してみよう! ■ PCC:悲観的同時実行制御(ロックを使う方式) 3
この問題の正解を確かめるためのゲーム 4
ゲームのルール(1/2) ● ゲームが始まったら制限時間内に攻撃ボタンを押す ○ 押すと DSQL 上のテーブル行を UPDATE → 1 秒待つ→ COMMIT ○ 同時に複数の人が攻撃した場合、COMMIT が成功した人が勝ち ■ 勝つと UPDATE → COMMIT の待ち時間が 1 秒増える(最大 5 秒まで) ■ 負けると 1 秒にリセット ● 攻撃ボタンは時間内に何度押しても OK 5
ゲームのルール(1/2) ● ゲームが始まったら制限時間内に攻撃ボタンを押す ○ 押すと DSQL 上のテーブル行を UPDATE → 1 秒待つ→ COMMIT ○ 同時に複数の人が攻撃した場合、COMMIT が成功した人が勝ち ■ 勝つと UPDATE → COMMIT の待ち時間が 1 秒増える(最大 5 秒まで) ■ 負けると 1 秒にリセット ● 攻撃ボタンは時間内に何度押しても OK 増えると有利? それとも不利? 6
ゲームのルール(2/2) ● 制限時間内で一番最後に COMMIT した人が優勝! ○ ボタンを押した後の COMMIT が制限時間外なら攻撃失敗 7
ゲームのルール(2/2) ● 制限時間内で一番最後に COMMIT した人が優勝! ○ ボタンを押した後の COMMIT が制限時間外なら攻撃失敗 待ち時間も考慮して ボタンを押す必要あり 8
当日の様子 9
さっきの問題の正解 10
ログから考察 ● 最後の 30 件分が優勝の行方に関係 ○ ただしゲームが 13:45:32.472 に終了→最後の 6 件は時間切れ ■ この 6 件は除外 ○ 最後の 30 件中、攻撃が成功しているのが 3 名 ■ 最後の 3 名を X さん・Y さん・Z さんとする 11
ログを順に見ていくと(X さんのターン) No. 攻撃開始時刻 参加者 待ち時間 (秒) コミット時刻 1 2025/07/05 13:45:27.831 成功 Xさん 1 2025/07/05 13:45:28.831 2 2025/07/05 13:45:27.859 失敗 Yさん 1 2025/07/05 13:45:28.859 3 2025/07/05 13:45:28.022 失敗 1 2025/07/05 13:45:29.022 4 2025/07/05 13:45:28.127 失敗 1 2025/07/05 13:45:29.127 5 2025/07/05 13:45:28.651 失敗 1 2025/07/05 13:45:29.651 6 2025/07/05 13:45:28.802 失敗 1 2025/07/05 13:45:29.802 攻撃成否 Xさん(No.1)とトランザクションが並行 コミットがXさんより後→負け 12
次のブロックは(Y さんのターン) No. 攻撃開始時刻 待ち時間 (秒) コミット時刻 5 2025/07/05 13:45:28.651 失敗 1 2025/07/05 13:45:29.651 6 2025/07/05 13:45:28.802 失敗 1 2025/07/05 13:45:29.802 7 2025/07/05 13:45:29.282 失敗 Xさん 2 2025/07/05 13:45:31.282 8 2025/07/05 13:45:29.319 成功 Yさん 1 2025/07/05 13:45:30.319 9 2025/07/05 13:45:29.337 失敗 1 2025/07/05 13:45:30.337 10 2025/07/05 13:45:29.383 失敗 1 2025/07/05 13:45:30.383 11 2025/07/05 13:45:29.416 失敗 1 2025/07/05 13:45:30.416 12 2025/07/05 13:45:29.485 失敗 1 2025/07/05 13:45:30.485 13 2025/07/05 13:45:29.514 失敗 1 2025/07/05 13:45:30.514 14 2025/07/05 13:45:29.985 失敗 1 2025/07/05 13:45:30.985 攻撃成否 参加者 Yさん(No.8)と並行しているがXさん(No.1)に負けたので既に失敗 13
次のブロックは(Y さんのターン) No. 攻撃開始時刻 待ち時間 (秒) コミット時刻 5 2025/07/05 13:45:28.651 失敗 1 2025/07/05 13:45:29.651 6 2025/07/05 13:45:28.802 失敗 1 2025/07/05 13:45:29.802 7 2025/07/05 13:45:29.282 失敗 Xさん 2 2025/07/05 13:45:31.282 8 2025/07/05 13:45:29.319 成功 Yさん 1 2025/07/05 13:45:30.319 9 2025/07/05 13:45:29.337 失敗 1 2025/07/05 13:45:30.337 10 2025/07/05 13:45:29.383 失敗 1 2025/07/05 13:45:30.383 11 2025/07/05 13:45:29.416 失敗 1 2025/07/05 13:45:30.416 12 2025/07/05 13:45:29.485 失敗 1 2025/07/05 13:45:30.485 13 2025/07/05 13:45:29.514 失敗 1 2025/07/05 13:45:30.514 14 2025/07/05 13:45:29.985 失敗 1 2025/07/05 13:45:30.985 攻撃成否 参加者 No.1で勝った→待ち時間が2秒→Yさん(No.8)よりコミットが後→負け 14
次のブロックは(Y さんのターン) No. 攻撃開始時刻 待ち時間 (秒) コミット時刻 5 2025/07/05 13:45:28.651 失敗 1 2025/07/05 13:45:29.651 6 2025/07/05 13:45:28.802 失敗 1 2025/07/05 13:45:29.802 7 2025/07/05 13:45:29.282 失敗 Xさん 2 2025/07/05 13:45:31.282 8 2025/07/05 13:45:29.319 成功 Yさん 1 2025/07/05 13:45:30.319 9 2025/07/05 13:45:29.337 失敗 1 2025/07/05 13:45:30.337 10 2025/07/05 13:45:29.383 失敗 1 2025/07/05 13:45:30.383 11 2025/07/05 13:45:29.416 失敗 1 2025/07/05 13:45:30.416 12 2025/07/05 13:45:29.485 失敗 1 2025/07/05 13:45:30.485 13 2025/07/05 13:45:29.514 失敗 1 2025/07/05 13:45:30.514 14 2025/07/05 13:45:29.985 失敗 1 2025/07/05 13:45:30.985 攻撃成否 参加者 Yさん(No.8)と並行・コミットが後→負け 15
優勝が決まるブロックは(Z さんのターン) No. 攻撃開始時刻 参加者 待ち時間 (秒) コミット時刻 15 2025/07/05 13:45:30.519 失敗 Yさん 2 2025/07/05 13:45:32.519 16 2025/07/05 13:45:30.530 成功 Zさん 1 2025/07/05 13:45:31.530 17 2025/07/05 13:45:30.601 失敗 1 2025/07/05 13:45:31.601 18 2025/07/05 13:45:30.682 失敗 1 2025/07/05 13:45:31.682 19 2025/07/05 13:45:30.735 失敗 1 2025/07/05 13:45:31.735 20 2025/07/05 13:45:30.958 失敗 1 2025/07/05 13:45:31.958 21 2025/07/05 13:45:31.120 失敗 1 2025/07/05 13:45:32.120 22 2025/07/05 13:45:31.218 失敗 1 2025/07/05 13:45:32.218 23 2025/07/05 13:45:31.274 失敗 1 2025/07/05 13:45:32.274 24 2025/07/05 13:45:31.380 失敗 1 2025/07/05 13:45:32.380 攻撃成否 No.8で勝った→待ち時間が2秒→時間切れ&Zさん(No.16)より後→負け 16
優勝が決まるブロックは(Z さんのターン) No. 攻撃開始時刻 参加者 待ち時間 (秒) コミット時刻 15 2025/07/05 13:45:30.519 失敗 Yさん 2 2025/07/05 13:45:32.519 16 2025/07/05 13:45:30.530 成功 Zさん 1 2025/07/05 13:45:31.530 17 2025/07/05 13:45:30.601 失敗 1 2025/07/05 13:45:31.601 18 2025/07/05 13:45:30.682 失敗 1 2025/07/05 13:45:31.682 19 2025/07/05 13:45:30.735 失敗 1 2025/07/05 13:45:31.735 20 2025/07/05 13:45:30.958 失敗 1 2025/07/05 13:45:31.958 21 2025/07/05 13:45:31.120 失敗 1 2025/07/05 13:45:32.120 22 2025/07/05 13:45:31.218 失敗 1 2025/07/05 13:45:32.218 23 2025/07/05 13:45:31.274 失敗 1 2025/07/05 13:45:32.274 24 2025/07/05 13:45:31.380 失敗 1 2025/07/05 13:45:32.380 攻撃成否 Zさん(No.16)と並行・コミットが後→負け 17
結果として ● 13:45:30.530 に攻撃が成功した Z さんが優勝! ○ ゲーム終了時刻 13:45:32.472 の 2 秒前を過ぎたあたり ■ ゲーム終了 1 秒前の直前を狙った攻撃を阻止したことで勝利 18
なお PCC(ロックを使う方式)では結果が変わる ● 詳しくは Qiita の記事にて ○ https://qiita.com/hmatsu47/items/75eee0b21e3be5b80061 19