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
halt
October 28, 2013
Programming
1
2.2k
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
3k
Other Decks in Programming
See All in Programming
個人開発で徳島大学生60%以上の心を掴んだアプリ、そして手放した話
akidon0000
1
150
250830 IaCの選定~AWS SAMのLambdaをECSに乗り換えたときの備忘録~
east_takumi
0
400
意外と簡単!?フロントエンドでパスキー認証を実現する WebAuthn
teamlab
PRO
2
780
ユーザーも開発者も悩ませない TV アプリ開発 ~Compose の内部実装から学ぶフォーカス制御~
taked137
0
190
ぬるぬる動かせ! Riveでアニメーション実装🐾
kno3a87
1
230
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
130
Putting The Genie in the Bottle - A Crash Course on running LLMs on Android
iurysza
0
140
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
3
260
為你自己學 Python - 冷知識篇
eddie
1
350
testingを眺める
matumoto
1
140
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
550
Compose Multiplatform × AI で作る、次世代アプリ開発支援ツールの設計と実装
thagikura
0
170
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
It's Worth the Effort
3n
187
28k
GraphQLの誤解/rethinking-graphql
sonatard
72
11k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Building Adaptive Systems
keathley
43
2.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Why Our Code Smells
bkeepers
PRO
339
57k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
930
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
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以外の場合、別の対応が必 要 この話を聞いて、知らない事があった人は、トラン
ザクションとロックの知識が足りてないという事な ので、もっと勉強していきましょう。 これで完璧ではない
おしまい ニーズがあれば続きやります