多くのアプリケーション開発者がデータベース処理の競合条件に関して少し問題があると聞いたことがあります。典型的な例は、このような何かを行く:データベースの競合条件
- ユーザー1が3
- ユーザー2であるnumStockは、また、まだ3
- ユーザー1つのデクリメントnumStock(であるnumStockを選択し、たとえば、フィールドを選択し、 app)を作成し、データベースに2を設定します。
- ユーザー2もnumStock(アプリケーション内)を減らし、データベースに2を設定します。
この例では、numStockフィールドは1になるはずですが、ユーザー間の競争のために2に設定されています。
もちろんロックを使用できますが、これを処理するもう1つの方法、つまりすべての行の詳細をWHERE条件として渡すことを考えました。上記の例では
に...私に説明してみましょう、SQLコードは次のようになります。
//は
SELECT itemID, numStock FROM items WHERE itemID = 45
//を選択するための
UPDATE items SET numStock = 2 WHERE itemID = 45
私の考えを更新レースを解決する:
// select
SELECT itemID, numStock FROM items WHERE itemID = 45
それがSELECT-EDため、データを
UPDATE items SET numStock = 2 WHERE itemID = 45 AND numStock = 3
はこのように、クエリのチェックはデータが変更された場合//更新。 私の質問は:(1)これはいつもうまくいくのでしょうか? (2)これはデータベースロックメカニズム(MySQLトランザクションなど)と比較して優れた選択肢ですか?
お時間をいただきありがとうございます。
単一のDB接続がある場合、DB競合状態が発生する可能性がありますか? – arrowd
一部のデータベースには、非同期プロセスを実行するオプションが含まれています.1つの接続でも競合状態が発生する可能性があります。もちろん、あなたの見通しに応じて、これらのプロセスは別個の接続としてカウントされるかもしれません。 ... –