1

対処したい状況は次のとおりです。

値の表:

id int
val varchar(20)
used bit
flag int

WHERE used = 0 AND flag IS NULLの最初の行を見つけて、「flag」に何かを貼り付けたい。これが行われると、他のユーザーはその行を使用できなくなります(フラグがnullではないため)

もちろん、これは簡単です。

UPDATE top (1) mytable
SET flag = someUniqueValue
WHERE used = 0
  AND flag IS NULL

私が知りたいのは、2人のユーザーが同じUPDATEを同時に実行している場合にどうなるかということです。明らかに、最初にそこに着きます。

このシナリオのテスト方法がわからないため、自分自身を見つけることができません。

2番目のユーザーは最初のユーザーを上書きしますか?(すぐに、またはロックが解除された後?)

2番目のユーザーがロックアウトされてエラーが発生しますか?(もしそうなら、どうすればエラーを検出できますか?)

どんな助けでもいただければ幸いです。

4

2 に答える 2

1

2 番目のユーザーが最初のユーザーをオーバーライドします。トランザクションに含まれていない限り、ロックされません。このリンクを確認してください....

于 2013-02-04T13:13:32.900 に答える
0

OK、少し調査した後、私は自分の答えを見つけました。

テーブルをロックし、更新を行ってから、テーブル ロックを解除する必要があるようです。次の SQL は、これらすべてを一度に実行します。

UPDATE top (1) mytable WITH (TABLOCKX)
SET flag = someUniqueValue
WHERE used = 0
  AND flag IS NULL

それをテストするために、2 つのループを実行しました (それぞれ 10000 サイクル - 少しやり過ぎましたがうまくいきました)。最初のループでは 1 つの値がスタックされ、2 番目のループでは別の値がスタックされました。最終結果は、両方のループの実行が終了したときに、テーブルに各値が正確に 10000 あることを示しました。

于 2013-02-04T13:15:30.413 に答える