我想在并发访问的情况下锁定某个表。
在存储过程中:
- 我截断了一张表
- 进行计算并填写上表
- 从 PROCEDURE 返回后,从表中进行选择
为了避免并发访问时出现问题,我计划添加一个“BEGIN TRANSACTION”,然后是“BEGIN TRY -END TRY”和“BEGIN CATCH - END CATCH”。我在“CATCH”中的“END-TRY”和“ROLLBACK”之前“提交”。
仅此一项就可以解决所有并发问题还是我需要做更多的事情。
非常感谢, 苏吉特
我想在并发访问的情况下锁定某个表。
在存储过程中:
为了避免并发访问时出现问题,我计划添加一个“BEGIN TRANSACTION”,然后是“BEGIN TRY -END TRY”和“BEGIN CATCH - END CATCH”。我在“CATCH”中的“END-TRY”和“ROLLBACK”之前“提交”。
仅此一项就可以解决所有并发问题还是我需要做更多的事情。
非常感谢, 苏吉特
您可以在事务期间使用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 Profiler 输出):
注意:SELECT OBJECT_ID(N'dbo.MyTable')
=1316199739