我正在写一个连接到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