2016-09-30 13 views
1

SQL SERVERのトランザクションでSELECT文を使用して行をロックすることはできますか?私は行をロックしたいので、外部からの他のトランザクションはその行に到達できません。SQL SERVERのトランザクションでSELECT文を使用して行をロックすることはできますか?

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

BEGIN TRANSACTION TRAN1 

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

誰か提案がありますか?行をロックするためにUPDATE文を実行する必要がありますか?

この質問には重複しないでください。私はUPDATEステートメントについて質問していないので、私は尋ねています。SELECT

編集:私は 'TRANSACTION ISOLATION LEVEL SERIALIZABLE'を試みましたが、あまりにも多くのものをロックします。私のSPは巨大で、多くのSELECT文があります。 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE'は、SPのすべてのSELECTから行をロックします。しかし、私は1つのテーブルから行だけをロックしたいと思います。

+0

@Oscar、いいえあなたが提供したリンクと重複していません。私はSELECTについて質問しています。あなたのリンクはUPDATEステートメント –

+0

を説明していますこの他の1つ:http://stackoverflow.com/questions/9502273/in-sql-server-how-can-i-lock-a-single-row-in-a-way-similar- oracleles- – Oscar

+0

@Oscarを選択すると、私はあなたが与えたリンクで解決策を試しました。それは私に大きな希望を与えましたが、それは仕事をしませんでした。 SPの "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"は多くのことをロックするためです。私のSPは巨大で、たくさんのSELECTをします。選択したすべての行がロックされると、システムは停止します。私は具体的には、SPのSELECTを使用して1つのテーブルから行をロックしたい –

答えて

1

私はHOLDLOCKテーブルのヒントがあなたが探しているものだと思います。 the documentationから:

HOLDLOCK はSERIALIZABLEに相当します。詳細については、このトピックの後半の「シリアル化可能」を参照してください。 HOLDLOCKは、指定されたテーブルまたはビューにのみ適用され、使用されるステートメントで定義されたトランザクションの期間のみに適用されます。HOLDLOCKは、FOR BROWSEオプションを含むSELECTステートメントでは使用できません。

2

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

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

また、RCSIでは、読者をブロックしません。

ここでは、SQL Serverのロックメカニズムに頼るのではなく、他のアプリケーション制御のロジックを使用する方がよいでしょう。

関連する問題