ホームページ >データベース >mysql チュートリアル >SQL Server で SELECT FOR UPDATE 機能を実現するにはどうすればよいですか?
SQL Server での排他的行アクセスの取得: SELECT FOR UPDATE の探索
SELECT FOR UPDATE の概念は、Oracle、DB2 でよく知られています。 、MySQL を使用すると、開発者はデータの取得中に行の排他ロックを取得できるようになり、他の同時トランザクションが選択したデータを変更するのを防ぐことができます。 データ。ただし、SQL Server で SELECT FOR UPDATE を使用する場合、いくつかの顕著な違いがあります。
提供されたコードでは、WITH (updlock) を使用して行レベルのロックを実現しようとしましたが、目的の結果が得られませんでした。その結果、他の接続が別の行を選択することもブロックされたためです。これに対処するために、SQL Server の SELECT FOR UPDATE のさまざまなオプションを調べてみましょう。
ROWLOCK
ROWLOCK ヒントは行レベルのロックを設定するために使用できますが、異なる行に対する SELECT 操作であっても、行全体をロックします。この動作は、同じ行のシナリオには一致しますが、異なる行のシナリオには一致しません。
updlock、rowlock
updlock と rowlock を組み合わせても状況は改善されません。
xlock,rowlock
updlock,rowlock と同様に、この組み合わせは広範なロックを提供し、同じ行と異なる行の両方に影響します。行
repeatableread
Repeatableread は、ファントム読み取りなどのデータ操作異常を防ぐ分離レベルです。ただし、行レベルのロックは実行されないため、この要件に対する解決策はありません。
DBCC TRACEON (1211,-1)
このトレース フラグはデータベースを設定します。すべての読み取り操作に対して -wide ROWLOCK を使用し、行レベルのロックを効果的にシミュレートします。ただし、これはすべての接続に影響するため、すべてのシナリオで適切であるとは限りません。
rowlock、xlock、holdlock
この組み合わせは、SELECT の行全体もロックします。別のrows.
updlock,holdlock
rowlock、xlock、holdlock と同様に、この組み合わせは行レベルのロックを提供しますが、HOLDLOCK を含むように拡張します。 semantics.
UPDLOCK,READPAST
スナップショット分離レベルの場合、この組み合わせにより、コミット可能な読み取りの行ロックなしで SELECT が可能になります。ただし、排他ロックは提供されないため、このユースケースには適していない可能性があります。
結論
残念ながら、検討したオプションはどれも SELECT の正確な動作を提供しません。 SQL Server を備えた他の DBMS で知られている FOR UPDATE。行レベルのロックは ROWLOCK によるオプションですが、他の SELECT 操作にも影響を与えるため、望ましくない可能性があります。このような場合、デッドロックやスナップショットの同時実行性の問題を捕捉することが、望ましいレベルのデータ一貫性を達成するために必要な代替手段になる可能性があります。
以上がSQL Server で SELECT FOR UPDATE 機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。