たとえば、ある賞品を瞬殺したい場合、賞品の数は 1 で、5 人が同時にリクエストした場合、1 つのリクエストが成功した後、データベースの値を 0 に変更してから、他のリクエストを実行します。残りの 4 つのリクエストが完了すると、製品の送信が完了したことを示すプロンプトが表示されます。すべての操作が完了すると、次のようになります。トランザクションを送信して同時リクエストを実行すると、賞品の数が負の数に変わります。賞品の数が更新された後にトランザクションが送信された場合、その他のトランザクションを開始し、同時に操作をリクエストすると、賞品の数は変化しません。ただし、これが行われ、他の操作が完了した後に失敗した場合は、以前に更新されたものを手動でロールバックする必要があります。賞品の数について、原因は何でしょうか。トランザクション処理のロジックが長すぎるためでしょうか? その場合、トランザクションは長いビジネス ロジックにどのように使用されるべきですか?
MySQL はデフォルトでトランザクションを自動的にコミットします。つまり、すべての SQL 命令は COMMIT である必要があります。この動作を積極的に無効にするには
トランザクション処理中、関連する SQL 命令はコピー内で分離されるため、比較的独立しています
しかし、これは他の接続がデータ操作を実行できないという意味ではありません
したがって、トランザクションは完全性を保証することしかできませんこのリンクの操作を制御できず、他の接続の操作を制御することはできません
<?php mysql_query('START TRANSACTION') if(奖品数量 <=0){ 提交事务 return ; } 奖品数量-1; * 其它后续操作 xxx xxxx ....... 提交事务 mysql_query('COMMIT')?>
実際にはトランザクションは必要ありません。それでも同じ
事务开始计数器减一如果计数器为负:回滚,退出其他操作提交
したがって、トランザクションは保証することしかできませんこのリンクの操作の完全性を監視し、他の接続の操作を制御することはできません
计数器减一如果计数器为负:计数器加一,退出其他操作
事务开始计数器减一如果计数器为负:回滚,退出其他操作提交
トランザクションを開きます
数量がマイナスの場合はロールバックして終了します それ以外の場合は数量 -1
その他の操作
送信
同時リクエストをシミュレートするには、curl_multi_initを使用します。まだ数量が 1 つ残っています リクエストを 5 回シミュレートすると、数値は -4 になります
はい、しかし、それがあなたがそれを説明した方法です
if(賞品の数 トランザクションを送信します
賞品の数 - 1 缶のみ実際に発生してから決定してください
update tbl_name set award=prize-1
select award from tbl_name
if award ROOLBACK
endif
モデレーターの辛抱強い回答に感謝します。同時控除がマイナスになることはなくなりました。最初に判断してから削減し、最初に削減してから効果を判断する必要があるといつも思っていました。