web-dev-qa-db-ja.com

SQL Server-ストアドプロシージャが終了するまでテーブルをロックする方法

私はこれをやりたい:

create procedure A as
  lock table a
  -- do some stuff unrelated to a to prepare to update a
  -- update a
  unlock table a
  return table b

そのようなことは可能ですか?

最終的に、SQL ServerレポートサービスレポートでプロシージャAを呼び出し、プロシージャが終了した後にのみテーブルaを表示するようにします。 (テーブルAを返すようにプロシージャAを変更することはできません)。

41
Greg

私自身と David Moye提供のリンク からこの回答が必要で、これを決定し、同じ質問を持つ他の人に役立つかもしれないと考えました:

CREATE PROCEDURE ...
AS
BEGIN
  BEGIN TRANSACTION

  -- lock table "a" till end of transaction
  SELECT ...
  FROM a
  WITH (TABLOCK, HOLDLOCK)
  WHERE ...

  -- do some other stuff (including inserting/updating table "a")



  -- release lock
  COMMIT TRANSACTION
END
50
Graham

トランザクションにTABLOCKXロックヒントを使用します。 この記事を参照 ロックの詳細については。

15
David Moye
BEGIN TRANSACTION

select top 1 *
from table1
with (tablock, holdlock)

-- You do lots of things here

COMMIT

これにより、現在の「トランザクション」が終了するまで「テーブルロック」が保持されます。

13
Xin