0

私はこのテーブルを持っています:

Mytable(ID, IDGroupReference, Model ...)

MyTable に多くのレコードがあります。はグループに属しているため、同じグループに属するすべてのレコードは同じ IDGroupReference を持ちます。IDGroup 参照は、グループに属するレコードの 1 つの ID です。したがって、グループのすべてのレコードは同じ IDGroupReference を持つため、1 つのクエリでグループのすべてのレコードを取得できます。

select * from MyTable where IDGroupReference = 12345;

1 つのレコードをあるグループから別のグループに変更できます。この場合、グループのすべてのレコードも変更したいと考えています。つまり、2 つのグループを 1 つにマージしたいのです。

この場合、次のクエリを使用できます。

Update Mytable set IDGroupReferencia = myIDReferenceGroup1 where IDGroupReference = IDGroupReferencieGroup2

グループ 2 の IDGroupReference をグループ 1 の IDGroupReference に設定しました。

私の疑問は、2 人のユーザーが 2 つの異なるレコードのグループを変更しようとしたときの同時実行性についてです。10,000 件のレコードと 2 人のユーザーを持つグループ 1 があるとします。ユーザー 1 はグループ 1 のレコード A をグループ 2 に変更しようとし、ユーザー 2 はレコード B をグループ 1 からグループ 3 に変更しようとします。

グループのレコード数、10.000、上記のクエリで IDGroupReference を更新しようとすると、SQL Server が 1 つずつ更新され、レコードがいくつあるのか、グループ内にいくつかのレコードが含まれている可能性があると思います。 b およびその他のレコードはグループ 3 に属し、すべてが同じグループに属している必要がありますが、グループ 2 または 3 では、どのユーザーが最後に更新されるかによって異なります。ただし、すべてのレコードは分割ではなく、同じグループに属している必要があります。

更新プログラムを使用すると、どのように機能しますか? トランザクションであり、影響を受けるレコードを誰も更新できないか、または最初のユーザーの更新中に 2 番目のユーザーがレコードを更新できるか?

つまり:

10 レコードのグループ 1。ユーザー 1 が更新を実行します。したがって、手順は次のとおりです。

  • SQL Server はレコード 1 を更新します。
  • SQL Server はレコード 2 を更新します

その間、2 番目のユーザーがクエリを実行します。

最初のユーザーのクエリによって更新される前に、2 番目のユーザーがレコード 3 を更新する可能性はありますか? これが発生すると、グループ 1 が 2 つのグループに分割されるため、一部のレコードはグループ 2 に移動し、一部のレコードはグループ 3 に移動します。

グループ 1 のすべてのレコードがグループ 2 またはグループ 3 に確実に移動するようにするにはどうすればよいですか?

ありがとう。

4

1 に答える 1

0

解決策は、SQL Server のヒントを使用することです。このリンクには、より多くの情報があります。

最初の更新:

Update Mytable set IDGroupReferencia = myIDReferenceGroup1 where IDGroupReference = IDGroupReferencieGroup2

次のように変更します。

Update Mytable with(tablock) set IDGroupReferencia = myIDReferenceGroup1 where IDGroupReference = IDGroupReferencieGroup2

既定では、SQL Server は更新により、更新中のレコードのみをブロックしますが、残りは変更できます。したがって、他の更新プロセスの途中で他の更新がレコードを変更するのを避けるために、すべてのテーブルをブロックする必要があります。

「with(tablock)」を使用すると、更新の開始時にテーブルがブロックされます。次に、where と一致するすべてのレコードを検索して更新します。テーブルがブロックされている場合、他のユーザーはこのテーブルからレコードを選択または更新できません。それが私の特定のケースで必要なものです。

于 2013-11-12T15:40:56.257 に答える