1

シャレーがアカウントによって参照されるシャレーのテーブルがあります...

CHALET
------
int ChaletId PK
int Berth

ACCOUNT
-------
int AccountId PK
int ChaletId FK

シャレーは参照されていないところから始まります。ユーザーがシャレーを購入すると、コードは参照されていないシャレーを見つけて、新しく作成されたアカウントに割り当てる必要があります。返されたシャレーには、同時購入者が同じシャレーに割り当てられないようにするために、それを参照するアカウントがコミットされるまで UPDLOCK が必要であると思います。

シャレーをフェッチする SELECT をどのように記述できますか? こんなことを考えていた..

SELECT * FROM CHALET WITH (UPDLOCK) c
LEFT JOIN ACCOUNT a
ON c.ChaletId = a.ChaletID
WHERE a.ChaletID is null
AND Berth = 4

問題は、このクエリが同時に実行されている場合、あるクエリが一方のテーブルの半分をロックし、別のクエリが残りの半分をロックし、デッドロックが確実になることだと思います。これを回避する方法はありますか?たとえば、選択したシャレーの行を同じ順序でロックすることは可能ですか?

乾杯、イアン。

4

3 に答える 3

1

アプリケーションで暫定的な予約を処理する必要があるときに、SQL 同時実行ロックを使用しようとしていると思います。

  • 進行中の予約のフラグ列または別のテーブルを作成します。
  • 他のすべてのクエリで予約中のアイテムを除外します。
  • ロールバックの場合は、その予約を巻き戻す必要があります。
于 2010-09-13T18:03:23.773 に答える
1

あなた(UPDLOCK, ROWLOCK, READPAST) が必要とすることをしますか?

于 2010-09-11T15:51:34.350 に答える
0

試す

SELECT * FROM CHALET WITH (UPDLOCK, HOLDLOCK) c
LEFT JOIN ACCOUNT a
ON c.ChaletId = a.ChaletID
WHERE a.ChaletID is null
AND Berth = 4

しかし、自分で作成しようとするのではなく、この種のものにアイデンティティ プロパティを使用しないのはなぜですか?

于 2010-09-11T15:33:46.920 に答える