質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

3回答

2164閲覧

同時刻に購入、同時刻に予約による重複データを防ぐ方法教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/08/20 03:03

PHP+Mysqlでのシステム開発をやってます。

めったに起こることではないですが、商品購入や予約などを、別ユーザが同時刻に行ってしまうことってあると思います。
このとき不整合なデータが作られないようにする手法を知りません。mysqlのトランザクションで対応ができると思っていたのですが、少し違いますよね?
複合ユニーク制約で対応できるケースもあると思いますが、それ以外の方法はあるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2021/08/20 03:10

どういう状況ですか?例えば以下の2例でもやり方変わると思いますが ・ひとつしか買えないのに二つ買えた ・在庫が残り1つだったのにタイミングがかち合って在庫数以上に購入された 質問には設計も試したコードとその結果も書かれてないので、回答も手法だけ回答すれば良いんですか?
退会済みユーザー

退会済みユーザー

2021/08/20 03:26

すみません、 この質問をするきっかけとなる作業が有り、それはユニーク制約で対応しました。 それがきっかけで「同時刻に〇〇」したときの汎用的に対処方法というか、そういう方法はないのかなという疑問が浮かび 投稿した質問になります。なので手法だけ回答いただけますと幸いです。
退会済みユーザー

退会済みユーザー

2021/08/20 03:49

排他制御・楽観的同時実行制御の話とは違うのですか? 「ユニーク制約で対応しました」ということは DB 側だけで対応できたという話のようですが・・・
guest

回答3

0

一般に「引当(ひきあて)」という処理ですね
在庫に対して引当をすると、利用可能在庫が減り、引当済みが増えます
クライアントのカートに入っている間は引当済み
出荷がされれば引当済みが減り
注文をキャンセルすれば引当済みが減って、利用可能在庫が増えます
ユーザーからの嫌がらせ対策のため確定までの猶予期間を設定も必要です

なお、それぞれの処理をするときにはかならずトランザクション対応が必要です

投稿2021/08/20 03:13

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/08/20 03:41

ありがとうございます。 自分の認識だとトランザクションとは、 「複数回のレコード書き込みを行うとき、途中失敗したときにロールバックして それまでの書き込みを取り消すもの」という認識でした。 ある一人のユーザが、購入ボタンを押した時の処理にトランザクションは必要だとは思いますが、 同時刻に、二人以上のユーザが購入ボタンを押した時にはトランザクションのみでは、意図しない不整合なレコードの追加・更新を許してしまうのではと自分の知識からは思いました。
guest

0

修正依頼のコメントを見ても具体的なシーンが分かりませんでした

状況によっては楽観ロックを実装します
トランザクションはシステム側のデータの不整合を防ぐもの、楽観ロックは業務的な意味でのデータの不整合を防ぐものです
例えば商品価格を変更する管理画面があって、二人の人が同時にログインして同時に商品管理画面を開いていたとして、一人目が価格更新をし、そのまま二人目も価格更新をしたらたとえトランザクションでは問題無かったとしても一人目の更新が二人目の更新によって上書きされてしまうのは分かりますね?そういう事態を防ぐものが楽観ロックです

投稿2021/08/20 03:48

hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これのことですかね?
webアプリ dbの排他制御に関して

TOCTOU というキーワードで調査してみると良いかと。
ockeghem さんが動画も作ってた気がします。

投稿2021/08/20 04:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問