ホームページ >データベース >mysql チュートリアル >SQL Server で SELECT FOR UPDATE を効率的に使用し、デッドロックを回避する方法

SQL Server で SELECT FOR UPDATE を効率的に使用し、デッドロックを回避する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-31 14:49:10392ブラウズ

How to Efficiently Use SELECT FOR UPDATE in SQL Server and Avoid Deadlocks?

SQL Server での SELECT FOR UPDATE: 理解とトラブルシューティング

SQL Server では、SELECT FOR UPDATE ステートメントを使用してロックを取得します。取得された行を保持し、クエリを発行したトランザクションが完了するまで、他の接続がそれらの行を変更または削除できないようにします。これは、更新または変更中にデータへの排他的アクセスを確保したいシナリオに役立ちます。

ただし、意図しないブロック動作を回避するには、正しいロック メカニズムを使用することが不可欠です。 READ_COMMITTED 分離レベルと READ_COMMITTED_SNAPSHOT=ON を指定した SQL Server 2005 では、WITH (updlock) ヒントを使用して SELECT FOR UPDATE を実装できます。

残念ながら、提供されている例では、WITH (updlock) を使用するとすべてがブロックされます。他の接続は、異なる ID を持つ行を選択する場合でも同様です。これは、updlock がテーブル全体の範囲ロックを取得し、ロックが解放されるまで他のアクセスを妨げるためです。

選択されている特定の行のみをロックするという望ましい動作を実現するには、ROWLOCK ヒントを使用することをお勧めします。その代わり。このヒントは、選択された行に対してのみロックを取得し、他の接続がブロックされることなくテーブル内の別の行にアクセスできるようにします。

更新された例は次のとおりです。

SELECT * FROM example WITH (ROWLOCK) WHERE>

このステートメントは、 id=1 の行のみをロックし、他の接続がサンプル テーブル内の他の行にアクセスし続けることを許可します。

ロック動作に注意することが重要です。トランザクション分離レベルやインデックスなどの他の要因の影響を受ける可能性もあります。あなたの場合、デッドロックの問題が発生したと述べました。デッドロックは、2 つ以上のトランザクションが同じ行のロックをお互いに解放するのを待機しているときに発生することがあります。デッドロックを防ぐには、スナップショット分離を使用するか、デッドロックの再試行やロック タイムアウトなどの適切なトランザクション管理ポリシーを実装することをお勧めします。

以上がSQL Server で SELECT FOR UPDATE を効率的に使用し、デッドロックを回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。