使用SET LOCK_TIMEOUT 0检查sql server中的表是否已锁定

时间:2012-03-08 11:28:24

标签: c# asp.net sql-server asp.net-mvc

基本上我需要检查表是否已从我的代码中锁定。

我知道如果直接在DB上运行它;

SELECT * FROM 'tablename' SET LOCK_TIMEOUT 0

如果表被锁定,我可以立即得到错误,如果表没有,我可以立即收到错误。但是,当我从我的代码中调用此语句时,它仍然需要等待一段时间才能在返回之前释放锁。我用来调用此查询的代码是;

SqlConnection conn = new SqlConnection(@"ConnectionString");
using(conn)
{
    conn.Open();
    var query = new SqlCommand("SELECT * FROM tablename SET LOCK_TIMEOUT 0", conn);

    try
    {
        SqlDataReader reader = query.ExecuteReader();
        // No lock
    }catch (Exception)
    {
        // Deal with lock exception
    }
} 

我想马上知道。有什么建议?或者更好的方法呢?

3 个答案:

答案 0 :(得分:2)

目前尚不清楚您要达到的目标是什么,目的是什么,但是您在之后设置锁定超时,而您需要在之前设置 >

答案 1 :(得分:1)

如果您的意思是交易锁定,请检查:

select
  object_name(resource_associated_entity_id) as 'TableName' ,*
from
  sys.dm_tran_locks
where resource_type = 'OBJECT'
  and resource_database_id = DB_ID() and 
  object_name(resource_associated_entity_id) = N'YourTableName'

如果表未被任何事务锁定

,则不会返回任何行

答案 2 :(得分:1)

也许是这样的:

select
  object_name(resource_associated_entity_id) as 'TableName' ,*
from
  sys.dm_tran_locks
where resource_type = 'OBJECT'
  and resource_database_id = DB_ID()

这将为您提供目前正在查看的表格的所有表格