1

SQL SERVERで、トランザクション内のSELECTステートメントで行をロックすることは可能ですか? 行をロックしたいので、外部からの他のトランザクションはその行に到達できません。

トランザクションがコミットまたはロールバックされた後、行を解放する必要があります。これが私が意味することです...

BEGIN TRANSACTION TRAN1

SELECT * FROM HR.Employees WITH (UPDLOCK) WHERE empid=1
...
...
...
...
COMMIT TRANSACTION

誰か提案がありますか?行をロックするには、UPDATE ステートメントを実行する必要がありますか?

この質問を重複としてマークしないでください。UPDATEステートメントについて尋ねているのではなく、SELECTについて尋ねているからです

編集:「SET TRANSACTION ISOLATION LEVEL SERIALIZABLE」を試みましたが、ロックが多すぎます。私の SP は巨大で、多くの SELECT ステートメントがあります。「SET TRANSACTION ISOLATION LEVEL SERIALIZABLE」は、SP 内のすべての SELECT からの行をロックします。ただし、1 つのテーブルの行のみをロックしたいと考えています。

4

2 に答える 2

2

UPDATE ロックは、更新ステートメントが更新する行を検索するときに使用される特別な種類のロックです。SHARED ロックと互換性があるため、同時実行性が向上し、XLOCK への変換時に変換デッドロックが発生する可能性が最小限に抑えられます。

SELECT ステートメントのテーブルで XLOCK ヒントを使用できますが、インデックスとデータへの物理パスによっては、予想以上にロックされる可能性があることに注意してください。

また、RCSI では、リーダーをブロックしません。

ここでは、SQL Server のロック メカニズムに依存するのではなく、他のアプリケーション制御のロジックを使用することをお勧めします。

于 2016-09-30T10:04:37.763 に答える