私は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ドライバを使用していますが、この質問には関係ないと思います。
到着したすべてのUPDATEまたはDELETEクエリにROWLOCKテーブルのヒントが含まれていることを確認する必要がありますか? – TheGameiswar
ROWLOCKテーブルのヒントが誤った通信から来たと言っているかもしれませんが、私はROWLOCKを他のタイプのロック(ページ、テーブル)。ドキュメントでは、「READ COMMITTEDまたはREPEATABLE READで取得された共用ロックは一般に行ロックですが、ページまたは表のかなりの数の行が読取りによって参照される場合は行ロックをページまたは表ロックにエスカレートできます。 私はそれらに常に行ロックを強制したいと思います。 –
このうち、これらの取引レベルで「READ」という言葉が多用されるのは不安です。私はこれらの行を書き込み操作のためにロックする必要があります。 –