0

通常、大規模な SQL Server 2008 テーブルは、SNAPSHOT ISOLATION トランザクションを使用して (比較的) 小さなチャンクで更新されます。チャンクがオーバーラップしないため、スナップショットはこれらの更新に非常に適しています。これらの更新は、長時間実行される単一の操作ではなく、トランザクションによってグループ化された多くの小さな 1 行の挿入/更新です。

優先度の低いトランザクションで、現在ロックされていないすべての行を更新したいと考えています。この動作を取得する方法を知っている人はいますか? 別の SNAPSHOT ISOLATION トランザクションは、行が衝突するとすぐに失敗しますか? それとも、失敗する前に可能な限りすべてを更新しますか?

try SET DEADLOCK_PRIORITY LOW-catch は役に立ちますか? おそらく、WHERE更新されていない行のみを対象とする a を使用した再試行ループでしょうか?

4

2 に答える 2

2

スナップショット分離は、実際にはそのようには機能しません。楽観的ロック モデルは、書き込み/コミットの準備が整うまで、ロックや競合をチェックしないことを意味します。また、クエリの「優先度」自体を設定することも、更新時に READPAST ヒントを使用することもできません。

各更新は暗黙のアトミック トランザクションであるため、(1 つのトランザクションで) 10 回のうち 1 回の更新が失敗すると、すべてロールバックされます。

SET DEADLOCK_PRIORITY は、dealdlock の場合にトランザクションがロールバックされる設定のみを設定します (それ以外の場合は、「最も安価な」ロールバックが選択されます)。

通常の衝突が予想される場合は、try-catch がほぼ必須です。

再試行ループは、別のロック モデルと NOWAIT ヒントを使用してブロックされるクエリをスキップする場合と同様に機能します。

于 2011-08-03T21:41:44.323 に答える
0

SNAPSHOT ISOLATION トランザクションは、更新の競合が発生するとすぐに失敗します。ただし、更新の優先順位を付けるために、データベース外のキューを使用します。

于 2011-08-04T02:43:09.567 に答える