3

私は 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 ドライバーを使用していますが、この質問には関係ないと思います。

4

1 に答える 1

3

あなたの質問を明確に理解できれば、SNAPSHOT ISOLATION を探しているようです。行ロックは行いませんが、行のバージョン管理を使用します。あなたの質問によると、パフォーマンスのために「読み取り」をロックしたくないようですが、書き込み操作の整合性を維持したいと考えています。

スナップショット分離レベルでは、行のバージョン管理を使用して、トランザクション レベルの読み取りの一貫性を提供します。読み取り操作は、ページまたは行のロックを取得しませんが、DML ステートメントで行のバージョン管理を行います。

(rowlock) と同様に、行スコープでロックを保持する必要があることをデータベースに指示するヒントです。これは、データベースがロックをブロックまたはテーブル スコープにエスカレートすることを回避することを意味します。これにより、削除が完了するのを待たずに、別のクエリが無関係な行を同時に読み取ることができます。

上記の行ロックの使用は、関係のない行を読み取ることができる SNAPSHOT ISOLATION を使用して実現できます。

于 2016-11-18T17:33:16.383 に答える