2017-10-11 11 views
0

私は、(手順/方法/サービス)から同じ行に同じ行を書き込む必要があります。ロックしないで同じ行に同時に書き込みますか?

最初に呼び出されるコールで行が作成され、次のコールで更新されます。

これは、ロックが行われていない状態で発生する必要があります。可能であれば、いずれかのソースを呼び出すことができるようにしたいただ1回(ロックエラーを処理することによって繰り返しはありません)

これは、他の人が呼び出して行を挿入する3番目の手順(xyzにのみ挿入する)、行がある場合はtrueを返します。 それはただ速く、両方のコールが同時に到着することはありません。

IF EXISTS(SELECT * FROM [dbo].[Wait] WHERE xyx= @xyz) 
    BEGIN 
      -- The row exists because the other datasource 
      -- has allready inserted a row with the same xyz 
      -- UPDATE THE ROW WITH DATA COMING IN  
    END 
    ELSE 
    BEGIN 
      -- No row with value xyz exists so we INSERT it with 
      -- the extra data. 
    END 

私はそれがロックを保証しないことを知っています。しかし、私の場合、実際には両方が同時に到着することはほとんどありませんし、ユーザーが制御していてもエラーが発生し、再試行します。しかし、私はこれを解決するためにwan't。

私はRow Versioningがポップアップしているのを見ていますが、それが役立つか、どうすればよいかわかりません。

The problem in an image

+0

あなたの間違いは、実際には同時更新を可能にするものであれば、どんなコストでも避けなければならない恐ろしい、悪いことであると考えています。 (悲観的な)ロックを解除する場合は、スナップショットの隔離と同じように、楽観的なバージョンベースの更新を使用する必要がありますが、再試行を待っているだけです。これは、RDBMSがアトミックに更新を処理する必要があるため、どちらか一方です。 –

+1

このシナリオでユーザーにエラーを表示させたくない場合は、 'SERIALIZABLE'トランザクションレベルを使用するか、' EXISTS'の 'HOLDLOCK'ヒントを使用して、* more *をロックする必要があります。ロックが実際にホットスポットになる場合は、常に更新を行い、更新の '@@ ROWCOUNT'が行を返さなかった場合には挿入を行うことで、わずかに最適化できます。これにより、更新が挿入よりも頻繁に発生する場合に特に役立つ明示的なチェックが保存されます。いずれの場合も、文が1つになることを保証するトランザクションが必要です(内部で処理する 'MERGE 'を使用しない限り)。 –

答えて

0

マイケル・J Swarts'記事Mythbusting: Concurrent Update/Insert Solutionsを見てください。これは可能なすべての行為と行為を表示します。実際にはのマージが含まれていないという事実を含めて、は並行性の問題を解決するうえで素晴らしい仕事をします。

関連する問題