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
transaction and lock for beginner
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
halt
October 28, 2013
Programming
1
2.3k
transaction and lock for beginner
halt
October 28, 2013
Tweet
Share
More Decks by halt
See All by halt
Let tested using a mock with PHPUnit
ha1t
4
3.1k
Other Decks in Programming
See All in Programming
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
3.9k
Amazon Bedrockを活用したRAGの品質管理パイプライン構築
tosuri13
5
720
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
130
Fragmented Architectures
denyspoltorak
0
160
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
280
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
300
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
AgentCoreとHuman in the Loop
har1101
5
240
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
690
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
190
MUSUBIXとは
nahisaho
0
130
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
1
750
Unsuck your backbone
ammeep
671
58k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Navigating Team Friction
lara
192
16k
Visualization
eitanlees
150
17k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
130
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
220
Marketing to machines
jonoalderson
1
4.6k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
190
Transcript
知っておきたい トランザクションとロックの 基礎知識 2013-10-28 第72回 PHP勉強会 @halt
1億PV/dayをさばくお仕事
• MySQL(InnoDB / REPEATABLE READ)の話 です。 • 分かりやすく説明するために、本来分割すべき 処理を1つのメソッドにまとめたりしています。 •
SQLクエリについても、本来必要なチェック処理 などを多少省いて説明しています。 そのままコピペして実戦投入するレベルにはなって ないので注意してください。 諸注意
データベース、使ったことありますか? MySQLを使った事がある人向けに、 トランザクションやロックの基本的な話をします。 あなたは本当に正しくMySQL使えているでしょう か?(私はニガテですw) 今日はMySQLを使う上で知っておきたい基礎中 の基礎をご紹介します。
こんなとき、どうかく? • (ソシャゲとかで)課金アイテムを買う ◦ お店で商品を選択(注文) ◦ その商品をプレイヤーが購入できるか調べる ◦ 商品をプレイヤーに渡す ◦
プレイヤーのお金を減らす 実際に書いてみよう!
action
model
Shop::sell() でやりたいこと • お金あるか確認 • アイテム渡す • お金減らす
実行すると… 「お金減らす」でエラーになると、アイテムだけ渡っ てお金が減らない!無限に買えるぞ! (現実には構文エラーよりクエリ前後のPHP処理が原因になる 事が多いです) お金あるか OK アイテム渡す OK お金減らす
syntax error
そこでトランザクション
トランザクション • 複数の処理を一続きに行う仕組み • 「全部実行する」か「1つも実行しない」のいずれ かしかない(一貫性の担保) • begin() と commit()
でくくる。 • rollback()で明示的にrollbackできる。(MySQL の場合、commitせずに接続を閉じると自動的 にrollbackされる)
実行すると… トランザクション中にエラーが発生すると、トランザ クション最初の状態に巻き戻る! お金あるか OK アイテム渡す OK お金減らす syntax error
全部なかった事に
まとめ • 一連の処理に一貫性を持たせる場合はトランザ クションを使いましょう。 • 処理の途中でエラーが起きたら、適切な状態に ロールバックできるようにしておきましょう。 これで安心!
ではない
連打したりパケット遅延が起こると… あれれー?100円しか持ってないのに100円のア イテムが二個かえちゃったぞー? リクエストA お金 リクエストB お金もってるか 100 アイテム渡す 100
お金もってるか お金減らす 0 アイテム渡す 0(-100) お金減らす
現状の問題 トランザクションは、処理の一貫性を保証するだ け。 begin中に他から値が参照されたり変更されると予 期しない動きになってしまう事がある。 そこで今回は行ロックを使う。
model
行ロックを使うと… ロックされている場合、その終了を待って動作する ようになる! トランザクションA お金 トランザクションB お金もってるか(ロック) 100 アイテム渡す 100
ロック解除待ち お金減らす 0 ロック解除待ち 0 お金もってるか(Error)
行ロック(FOR UPDATE) • トランザクション内で実行する事で、そのトラン ザクション中、特定行をロックする仕組み • ロック中に他のトランザクションが該当行にアク セスすると、待ち状態になり、ロック中のトランザ クションが終了すると動き出す •
内部的には、インデックスをロックしているの で、インデックスを正しく使ってないと想定通りに 動かない事がある。最悪テーブルロックになる
行ロック(FOR UPDATE) • ロック待ち状態はアクセス時間に直に響くので、 できるだけ短くする。トランザクション内でPHP の重い処理とか入れないように注意する。 • デッドロックが起こらないように常に注意しない といけない •
共有ロックとの使い分けを理解しておく必要が ある。 • ギャップロックやネクストキーロックの仕組みを 理解しておく必要がある
まとめ • データベースを操作するときは、状況にあわせ て、トランザクションやロックを使っていく必要が ある。 • トランザクションは一貫性の保証をしてくれる。 • ロックは他のセッションとの間に秩序を作れる
これでひとまず安心!
• 今回のケースはいろんなものを削ってシンプル にした上で説明しているので、現実にはもっと複 雑な状況になる事が多い。(シャーディングして いる場合とか) • 共有ロックなど、適切に使い分ける技術は他に もあるし、MySQL以外の場合、別の対応が必 要 この話を聞いて、知らない事があった人は、トラン
ザクションとロックの知識が足りてないという事な ので、もっと勉強していきましょう。 これで完璧ではない
おしまい ニーズがあれば続きやります