Как проверить, заблокирована ли таблица на сервере sql
У меня есть большой отчет, который я запускаю на сервере sql. Это займет несколько минут. Я не хочу, чтобы пользователи щелкали дважды. Поскольку я переношу всю процедуру в транзакцию, как я могу проверить, заблокирована ли таблица транзакцией? Если это так, я хотел бы вернуть сообщение об ошибке "Генерация отчета, попробуйте еще раз через несколько минут".
Как это можно сделать?
Ответы
Ответ 1
Еще лучше, рассмотрим sp_getapplock
, который предназначен для этого. Или используйте SET LOCK_TIMEOUT
В противном случае вам нужно будет что-то сделать с sys.dm_tran_locks
, который я буду использовать только для файлов DBA: не для определенных пользователем concurrency.
Ответ 2
Вы можете использовать представление sys.dm_tran_locks
, которое возвращает информацию о текущих ресурсах менеджера блокировок.
Попробуйте это
SELECT
SessionID = s.Session_id,
resource_type,
DatabaseName = DB_NAME(resource_database_id),
request_mode,
request_type,
login_time,
host_name,
program_name,
client_interface_name,
login_name,
nt_domain,
nt_user_name,
s.status,
last_request_start_time,
last_request_end_time,
s.logical_reads,
s.reads,
request_status,
request_owner_type,
objectid,
dbid,
a.number,
a.encrypted ,
a.blocking_session_id,
a.text
FROM
sys.dm_tran_locks l
JOIN sys.dm_exec_sessions s ON l.request_session_id = s.session_id
LEFT JOIN
(
SELECT *
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
) a ON s.session_id = a.session_id
WHERE
s.session_id > 50
Ответ 3
Если вы проверяете, применяется ли привязка к таблице или нет, попробуйте выполнить следующий запрос.
SELECT resource_type, resource_associated_entity_id,
request_status, request_mode,request_session_id,
resource_description, o.object_id, o.name, o.type_desc
FROM sys.dm_tran_locks l, sys.objects o
WHERE l.resource_associated_entity_id = o.object_id
and resource_database_id = DB_ID()
Ответ 4
sys.dm_tran_locks содержит информацию о блокировке сеансов
Если вы хотите узнать, что определенная таблица заблокирована или нет, вы можете использовать следующий запрос
SELECT
*
from
sys.dm_tran_locks
where
resource_associated_entity_id = object_id('schemaname.tablename')
если вы заинтересованы в поиске имени пользователя и выполняемого запроса
SELECT
DB_NAME(resource_database_id)
, s.original_login_name
, s.status
, s.program_name
, s.host_name
, (select text from sys.dm_exec_sql_text(exrequests.sql_handle))
,*
from
sys.dm_tran_locks dbl
JOIN sys.dm_exec_sessions s ON dbl.request_session_id = s.session_id
INNER JOIN sys.dm_exec_requests exrequests on dbl.request_session_id = exrequests.session_id
where
DB_NAME(dbl.resource_database_id) = 'dbname'
Для более infomraton блокировка запроса
Дополнительная информация о sys.dm_tran_locks