簡體   English   中英

檢查Sql Server中的表是否被鎖定

[英]Check if a Table in Sql Server is locked

我正在編寫一個Windows應用程序,該應用程序連接到sql server並在表上執行更新操作。

已經有另一個名為P2的程序正在更改同一表中的數據。 所以桌子被鎖住了

從我的應用程序訪問表時出現錯誤

我需要一種解決方案,其中程序首先檢查表是否已被鎖定,如果表未鎖定,則必須更新數據。 如果表已被鎖定,則它必須等待一段時間並重試該操作。

誰能給我一個?

在執行操作之前檢查某物是否已鎖定絕不是一個好主意。 因為可以在執行檢查之后和執行更新之前獲取鎖,所以:

if(noLockOnTheTable)
{
  // ... something else acquires the lock just at this point
  updateTable();
}

因此嘗試檢查該鎖是徒勞的。 您應該繼續嘗試嘗試獲取鎖,然后立即執行更新。 您可以避免這種情況,因為其他操作花費的時間太長,並且您不希望用戶等待。 在這種情況下,您可以指定“短鎖等待超時”並向用戶提供一條消息,提示“稍后重試”。 用戶無需等待。

您可以嘗試以下方法:

CREATE TABLE #lockTable
(
[spid] smallint
, [dbid] smallint
, [objid] int
, [indid] smallint
, [type] nchar(4)
, [resource] nchar(32)
, [mode] nvarchar(8)
, [status] nvarchar(5)
);

INSERT INTO #lockTable EXEC sp_lock;

SELECT * FROM #lockTable WHERE objeid = OBJECT_ID('mytable');

DROP TABLE #lockTable;

例如-在當前會話中獲取鎖:

create table dbo.test (i int)
Go    

begin tran
insert into dbo.test With (tablock) (i) values (1)
Go
Select 
    DB_NAME(tl.resource_database_id) database_name, 
    tl.resource_type, 
    case when resource_type = 'OBJECT' then OBJECT_NAME(tl.resource_associated_entity_id) Else null End ObjectName, 
    tl.resource_type, 
    tl.request_mode,
    tl.request_status,
    tl.* 
From sys.dm_tran_locks tl
Where request_session_id = @@SPID 
order by case when resource_type = 'OBJECT' then OBJECT_NAME(tl.resource_associated_entity_id) Else null End,
    tl.request_mode, tl.resource_type
Rollback

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM