0

我想在并发访问的情况下锁定某个表。

在存储过程中:

  • 我截断了一张表
  • 进行计算并填写上表
  • 从 PROCEDURE 返回后,从表中进行选择

为了避免并发访问时出现问题,我计划添加一个“BEGIN TRANSACTION”,然后是“BEGIN TRY -END TRY”和“BEGIN CATCH - END CATCH”。我在“CATCH”中的“END-TRY”和“ROLLBACK”之前“提交”。

仅此一项就可以解决所有并发问题还是我需要做更多的事情。

非常感谢, 苏吉特

4

1 回答 1

2

您可以在事务期间使用TABLOCKTABLOCKX引用)锁定整个表:

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 Profiler 输出):

在此处输入图像描述

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

于 2013-10-26T08:49:59.383 回答