2012-03-24 13 views
3

多くのアプリケーション開発者がデータベース処理の競合条件に関して少し問題があると聞いたことがあります。典型的な例は、このような何かを行く:データベースの競合条件

  • ユーザー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トランザクションなど)と比較して優れた選択肢ですか?

お時間をいただきありがとうございます。

答えて

5

この戦略は、「楽観的ロック」として機能しています。それは成功したと仮定して処理を行い、最後に成功したかどうかを実際に確認するためです。

もちろん、トランザクションを再試行する方法が必要です。失敗の可能性が非常に高い場合は、非効率になる可能性があります。しかし、ほとんどの場合、それはうまく動作します。

+1

単一のDB接続がある場合、DB競合状態が発生する可能性がありますか? – arrowd

+1

一部のデータベースには、非同期プロセスを実行するオプションが含まれています.1つの接続でも競合状態が発生する可能性があります。もちろん、あなたの見通しに応じて、これらのプロセスは別個の接続としてカウントされるかもしれません。 ... –