0

同時アクセス時に特定のテーブルをロックしたい。

ストアド プロシージャ内:

  • テーブルを切り捨てる
  • 計算を行い、上の表に入力します
  • PROCEDUREから戻った後、テーブルから選択を行います

同時アクセスが発生した場合の問題を回避するために、「BEGIN TRANSACTION」に続いて「BEGIN TRY -END TRY」と「BEGIN CATCH - END CATCH」を追加する予定です。「END-TRY」の直前に「COMMIT」し、「CATCH」内で「ROLLBACK」します。

これだけですべての並行性の問題が解決するのでしょうか、それとももっと何かをする必要があります。

どうもありがとう、スジット

4

1 に答える 1

2

TABLOCKまたはTABLOCKX(参照)を使用して、トランザクション中にテーブル全体をロックできます。

BEGIN TRANSACTION;

-- For shared locking:    
-- This will take a S(shared) lock at table level for duration of transaction
-- SELECT TOP(0) * FROM dbo.MyTable WITH(TABLOCK,HOLDLOCK)
-- HOLDLOCK hint is needed in this case because 
-- default behavior at default transaction isolation level (READ COMMITTED) 
-- is to maintain a S lock only during record reading.

-- For exclusive locking:    
-- This will take a (x)X(clusive) lock at table level for duration of transaction
SELECT TOP(0) * FROM dbo.MyTable WITH(TABLOCKX)

ROLLBACK;

例 (SQL プロファイラーの出力):

ここに画像の説明を入力

注: SELECT OBJECT_ID(N'dbo.MyTable')=1316199739

于 2013-10-26T08:49:59.383 に答える