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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
490
受け入れテスト駆動開発(ATDD)×AI駆動開発 AI時代のATDDの取り組み方を考える
kztakasaki
2
530
DSPy入門 Pythonで実現する自動プロンプト最適化 〜人手によるプロンプト調整からの卒業〜
seaturt1e
1
580
15年目のiOSアプリを1から作り直す技術
teakun
1
610
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
7.7k
浮動小数の比較について
kishikawakatsumi
0
380
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
960
Codex の「自走力」を高める
yorifuji
0
960
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
390
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
250
NOT A HOTEL - 建築や人と融合し、自由を創り出すソフトウェア
not_a_hokuts
2
590
今、アーキテクトとして 品質保証にどう関わるか
nealle
0
200
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Claude Code のすすめ
schroneko
67
220k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
110
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
130
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
260
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
380
Unsuck your backbone
ammeep
672
58k
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以外の場合、別の対応が必 要 この話を聞いて、知らない事があった人は、トラン
ザクションとロックの知識が足りてないという事な ので、もっと勉強していきましょう。 これで完璧ではない
おしまい ニーズがあれば続きやります