同じ行を、同時に書きかえる
在庫が 1 個のとき、2 人が同時に買うと、両方が「1 個ある」と読んで、在庫がマイナスになる。読んでから書くまでの間、ほかの人が書けないように鍵(ロック)をかける。ロックはトランザクションの中で使う。
DB::transaction(function () use ($id) {
$item = Item::where('id', $id)->lockForUpdate()->first();
if ($item->stock < 1) {
abort(409); // 売り切れ
}
$item->stock -= 1;
$item->save();
});Laravel「Pessimistic Locking」 / Laravel「Database Transactions」