私は MSSQL ドライバーのラッパーを作成していますが、すべての着信 UPDATE または DELETE クエリに ROWLOCK テーブル ヒントが含まれていることを確認する必要があると言われました。WITH ROWLOCK を含める既存のすべてのクエリの正規表現ではなく、トランザクションの分離レベルでこれを行うことができれば素晴らしいことです。現在、私は SOL であるか、ROWLOCK が実際に何をしているのかについて非常に混乱しているだけなので、私の理解に欠陥がある場合はお知らせください。
私が達成しようとしているのは、UPDATE または DELETE ステートメントによって触れられたすべての行が、私のトランザクションによって引き起こされた変更と一貫性を保つだけでなく、その期間全体にわたってトランザクションだけで一貫性を保つことであると信じていますが、重要なことは、影響を受ける行が触れられないようにすることです。他のトランザクションによって同時に。
利用可能な分離レベルは次のとおりです ( https://msdn.microsoft.com/en-us/library/ms173763.aspxから)。
-- Syntax for SQL Server and Azure SQL Database
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT
| SERIALIZABLE
}
[ ; ]
READ COMMITED と REPEATABLE READ の両方が、私が触れているデータがトランザクションのスコープ内の外部変更の影響を受けるのを防ぐのに役立つようです。ただし、ROWLOCK のポイントを正しく解釈している場合、スコープ内のデータの状態を保持したいだけでなく、他の誰かが私が扱っているデータに何らかの形で触れないようにしたいと考えています。完全に終了し、トランザクションがコミットされました。
ここでの問題は、ROWLOCK のポイントが何であるかを誤解していることだと私は確信し、期待しています。繰り返しますが、タスクは、すべての UPDATE または DELETE ステートメントに ROWLOCK テーブル ヒントを含めることですが、これはトランザクション分離レベルから行います。私は Tedious Node.js ドライバーを使用していますが、この質問には関係ないと思います。