Проверка, заблокирована ли таблица на сервере sql с помощью SET LOCK_TIMEOUT 0 - PullRequest
2 голосов
/ 08 марта 2012

В основном мне нужно проверить, заблокирована ли таблица из моего кода.

Я знаю, запускаю ли я это прямо на БД;

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 ]

2 голосов
/ 08 марта 2012

Не ясно, какую цель вы пытаетесь достичь и для какой цели, но вы устанавливаете тайм-аут блокировки после ВЫБОР, тогда как вам нужно установить до .

1 голос
/ 08 марта 2012

Может быть, что-то вроде этого:

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

Это даст вам все таблицы, которые в данный момент просматриваются

1 голос
/ 08 марта 2012

Если вы имеете в виду блокировку транзакции, отметьте это:

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'

Это не вернет строки, если таблица не заблокирована какой-либо транзакцией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...