ホームページ >バックエンド開発 >PHPチュートリアル >データベース トランザクションを使用した後も、負のレコードが並行状態で表示されます。

データベース トランザクションを使用した後も、負のレコードが並行状態で表示されます。

WBOY
WBOYオリジナル
2016-06-23 13:07:161037ブラウズ

たとえば、ある賞品を瞬殺したい場合、賞品の数は 1 で、5 人が同時にリクエストした場合、1 つのリクエストが成功した後、データベースの値を 0 に変更してから、他のリクエストを実行します。残りの 4 つのリクエストが完了すると、製品の送信が完了したことを示すプロンプトが表示されます。すべての操作が完了すると、次のようになります。トランザクションを送信して同時リクエストを実行すると、賞品の数が負の数に変わります。賞品の数が更新された後にトランザクションが送信された場合、その他のトランザクションを開始し、同時に操作をリクエストすると、賞品の数は変化しません。ただし、これが行われ、他の操作が完了した後に失敗した場合は、以前に更新されたものを手動でロールバックする必要があります。賞品の数について、原因は何でしょうか。トランザクション処理のロジックが長すぎるためでしょうか? その場合、トランザクションは長いビジネス ロジックにどのように使用されるべきですか?
MySQL はデフォルトでトランザクションを自動的にコミットします。つまり、すべての SQL 命令は COMMIT である必要があります。この動作を積極的に無効にするには

トランザクション処理中、関連する SQL 命令はコピー内で分離されるため、比較的独立しています
しかし、これは他の接続がデータ操作を実行できないという意味ではありません

したがって、トランザクションは完全性を保証することしかできませんこのリンクの操作を制御できず、他の接続の操作を制御することはできません

<?php  mysql_query('START TRANSACTION')  if(奖品数量 <=0){     提交事务      return ;      }   奖品数量-1;  * 其它后续操作    xxx    xxxx     .......    提交事务    mysql_query('COMMIT')?>

実際にはトランザクションは必要ありません。それでも同じ

事务开始计数器减一如果计数器为负:回滚,退出其他操作提交

mysql はデフォルトで自動的にトランザクションをコミットします。つまり、すべての SQL 命令は COMMIT です この動作は積極的にオフにする必要があります

トランザクション処理中、関連する SQL 命令はコピー内に分離されるため、比較的独立しています

しかし、これは他の接続がデータ操作を実行できないという意味ではありません


したがって、トランザクションは保証することしかできませんこのリンクの操作の完全性を監視し、他の接続の操作を制御することはできません

计数器减一如果计数器为负:计数器加一,退出其他操作


実際には、トランザクションは必要ありません。それでも同じです
事务开始计数器减一如果计数器为负:回滚,退出其他操作提交



すみません、ここのカウンターは、の賞品の数を指しますか?データベースは?
そうであれば

私もそう判断しました

トランザクションを開きます

数量がマイナスの場合はロールバックして終了します それ以外の場合は数量 -1
その他の操作
送信


同時リクエストをシミュレートするには、curl_multi_initを使用します。まだ数量が 1 つ残っています リクエストを 5 回シミュレートすると、数値は -4 になります



はい、しかし、それがあなたがそれを説明した方法です
if(賞品の数 トランザクションを送信します

‐‐‐‐‐ 4‐‐‐‐‐4.
* その他のフォローアップ操作


賞品の数 -1;
あなたは彼の合法性を判断したいとは言っていません


はい、それがあなたがそれを説明した方法です
if (賞品の数 トランザクションを送信
return < tbl_name から賞品を選択
if 賞品 endif


賞品の数 - 1 缶のみ実際に発生してから決定してください

update tbl_name set award=prize-1
select award from tbl_name
if award ROOLBACK
endif
モデレーターの辛抱強い回答に感謝します。同時控除がマイナスになることはなくなりました。最初に判断してから削減し、最初に削減してから効果を判断する必要があるといつも思っていました。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。