2016-11-18 5 views
2

私はMSSQLドライバのラッパーを作成しています。私はすべての着信UPDATEまたはDELETEクエリにROWLOCKテーブルヒントが含まれていることを確認する必要があると言われています。 WITH ROWLOCKを含める既存のすべてのクエリのwhackjob正規表現ではなく、トランザクション分離レベルでこれを行うことができれば素晴らしいと思います。さて、私はSOLかROWLOCKが実際に行っていることについては非常に混乱していますので、私の理解に間違いがあるかどうか教えてください。MSSQLのトランザクション分離レベルから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かつ再現READ両方私は範囲内の任意の外部の変化の影響を受けることから、触れていたデータを予防するのに有用であるかのように思え私の取引のしかし、私がROWLOCKのポイントを正しく解釈しているならば、私は自分のスコープ内のデータの状態を保持したいだけでなく、他の誰かが私が扱っているデータに触れないようにしたいと思います。完全に包み込まれており、トランザクションがコミットされています。

ここでの問題は、ROWLOCKのポイントを誤解していると確信しています。だから、私は、すべてのUPDATEまたはDELETE文にROWLOCKテーブルのヒントを含めるが、トランザクションの分離レベルからROWLOCKテーブルヒントを含めることを覚えておきます。退屈なNode.jsドライバを使用していますが、この質問には関係ないと思います。

+2

到着したすべてのUPDATEまたはDELETEクエリにROWLOCKテーブルのヒントが含まれていることを確認する必要がありますか? – TheGameiswar

+0

ROWLOCKテーブルのヒントが誤った通信から来たと言っているかもしれませんが、私はROWLOCKを他のタイプのロック(ページ、テーブル)。ドキュメントでは、「READ COMMITTEDまたはREPEATABLE READで取得された共用ロックは一般に行ロックですが、ページまたは表のかなりの数の行が読取りによって参照される場合は行ロックをページまたは表ロックにエスカレートできます。 私はそれらに常に行ロックを強制したいと思います。 –

+0

このうち、これらの取引レベルで「READ」という言葉が多用されるのは不安です。私はこれらの行を書き込み操作のためにロックする必要があります。 –

答えて

1

私はあなたの質問をはっきりと理解すれば、あなたはスナップショットを探しているようです。行ロックは行いませんが、行バージョニングを使用します。あなたの質問によると、パフォーマンスのために "読み込み"にロックをかけたくないようですが、書き込み操作の整合性を維持したいと思うようです。

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

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

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

+0

パーフェクト、これを今チェックアウトするつもりですが、これが私の必要とするように聞こえます。ありがとうございました! –

+0

それでは、私はフォローアップを持っています、もし私が書き込み操作のためにSNAPSHOT ISOLATIONを使用していて、行がロックされていないということを意味するのであれば、デッドロックの可能性はありませんか? –

+0

@PauloBlack https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx これは、複雑なクエリのデッドロックの可能性を大幅に減らす –