Как определить, заблокирована ли строка в таблице сервера SQL? - PullRequest
1 голос
/ 10 января 2011

Предположим, если я явно заблокирую строку через sql, как

BEGIN TRANSACTION
select * from bbajobs WITH (ROWLOCK, UPDLOCK) where JID=40970

тогда как я могу определить, что строка заблокирована, чей JID равен 40970?

Я ищу в Google и нашел какое-то решение, но оно не работает. Пожалуйста, помогите мне определить, заблокирована строка или нет. Спасибо.

Ответы [ 3 ]

2 голосов
/ 10 января 2011

Возможно, это возможно при использовании системного представления, такого как sys.dm_tran_locks, но обычно вы обнаруживаете блокировки на странице, а не на одной строке, тогда было бы больно находить, заблокирована ли конкретная строка, если это вообще возможно.

Модели блокировок обычно реализуются в приложении (управляются в памяти на централизованном сервере приложений или в таблице блокировок, если у вас есть независимые клиентские программы)

1 голос
/ 05 марта 2013

Используйте подсказки блокировки NOLOCK и READPAST .Например, если у вас есть таблица, в которой первичный ключ называется Id

SELECT [Id] FROM [dbo].[TableName] WITH(NOLOCK)
WHERE [Id] NOT IN
(
    SELECT [Id] FROM [dbo].[TableName] WITH(READPAST)
)
0 голосов
/ 19 июня 2018

Вы можете получить список незафиксированных транзакций с помощью следующего запроса:

SELECT
    dm_tran_locks.request_session_id,
    dm_tran_locks.resource_database_id,
    DB_NAME(dm_tran_locks.resource_database_id) AS dbname,
    dm_tran_locks.resource_associated_entity_id,
    dm_tran_locks.resource_type,
    dm_tran_locks.resource_description,
    dm_tran_locks.resource_associated_entity_id,
    dm_tran_locks.request_mode,
    dm_tran_locks.request_status
FROM sys.dm_tran_locks 
WHERE resource_associated_entity_id > 0
AND resource_database_id = DB_ID();

Тогда можно получить данные из заблокированной строки с помощью:

SELECT *
FROM [your_table]
WHERE %%lockres%% = '[insert dm_tran_locks.resource_description value]';

Итак,для вашего примера вы можете указать количество блокировок в строке:

SELECT COUNT(1)
FROM sys.dm_tran_locks locks
INNER JOIN bbajobs
    ON bbajobs.%%lockres%% = locks.resource_description
WHERE
    resource_associated_entity_id > 0
AND
    -- Ensure the lock is on the same database
    resource_database_id = DB_ID()
AND
    -- Filter on row only
    resource_type = 'KEY'
AND
    -- Filter on request ID
    bbajobs.JID = 40970
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...