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
2.8k
Other Decks in Programming
See All in Programming
menu基盤チームによるGoogle Cloudの活用事例~Application Integration, Cloud Tasks編~
yoshifumi_ishikura
0
110
CSC305 Lecture 25
javiergs
PRO
0
130
선언형 UI에서의 상태관리
l2hyunwoo
0
150
Jakarta EE meets AI
ivargrimstad
0
240
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
1
140
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
270
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
250
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
170
talk-with-local-llm-with-web-streams-api
kbaba1001
0
180
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.5k
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
510
Speed Design
sergeychernyshev
25
670
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Building an army of robots
kneath
302
44k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
Scaling GitHub
holman
458
140k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
GraphQLとの向き合い方2022年版
quramy
44
13k
Agile that works and the tools we love
rasmusluckow
328
21k
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以外の場合、別の対応が必 要 この話を聞いて、知らない事があった人は、トラン
ザクションとロックの知識が足りてないという事な ので、もっと勉強していきましょう。 これで完璧ではない
おしまい ニーズがあれば続きやります