我正在寫一個連接到sql server的windows應用程序,並對錶執行更新操作。檢查Sql Server中的表是否被鎖定
已經有另一個名爲P2的程序正在修改同一個表中的數據。因此,表被鎖定
我得到一個錯誤,而從我的應用程序訪問該表
我需要在程序首先檢查表已經鎖定,如果表沒有被鎖定的數據的解決方案必須更新。 如果表已經被鎖定,那麼它必須等待一段時間然後重試該操作。
任何人都可以提供給我一個嗎?
我正在寫一個連接到sql server的windows應用程序,並對錶執行更新操作。檢查Sql Server中的表是否被鎖定
已經有另一個名爲P2的程序正在修改同一個表中的數據。因此,表被鎖定
我得到一個錯誤,而從我的應用程序訪問該表
我需要在程序首先檢查表已經鎖定,如果表沒有被鎖定的數據的解決方案必須更新。 如果表已經被鎖定,那麼它必須等待一段時間然後重試該操作。
任何人都可以提供給我一個嗎?
它從來都不是一個好主意,看一看是執行操作前鎖定或沒有。因爲鎖可以爲您進行檢查後,剛剛被收購,你執行你的更新之前:
if(noLockOnTheTable)
{
// ... something else acquires the lock just at this point
updateTable();
}
所以這是徒勞的嘗試檢查鎖。您應該繼續嘗試獲取鎖,然後立即執行更新。您可能會避免這種情況,因爲其他操作時間過長,您不希望用戶等待。在這種情況下,您可以指定一個「短鎖等待超時」,並向用戶提供一條消息,說「稍後再試」。用戶不需要等待。
我明白了你的觀點。但是,如果已經使用了表格 – 2012-07-18 08:19:52
yes,那麼執行更新命令時會出現錯誤。你應該處理那個錯誤(try/catch)並且把它當作你喜歡的。 – 2012-07-18 08:50:06
我在做thnx – 2012-07-26 06:32:47
你可以嘗試以下方法:
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;
我確實需要的是如何檢查一個特定的表是否有鎖。謝謝 – 2012-07-18 08:16:12
對於示例 - 獲得當前會話鎖:
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
我真正需要的是如何檢查一個特定的表是否有鎖。通過使用結果我將執行剩餘的任務。謝謝 – 2012-07-18 08:15:51
檢查鏈接http://stackoverflow.com/questions/599453/find-locked-table-in-sql-server – 2012-07-18 07:45:36
我沒有得到我需要的答案就是這個鏈接,所以我用我的方式問了問題! – 2012-07-18 08:21:39