Нахождение нашего, какой Ряд в Таблице заблокирован - SQL сервер - PullRequest
1 голос
/ 07 апреля 2020

У меня есть следующий запрос, который возвращает любые блокировки для указанной таблицы c. Тем не менее, мне нужно, чтобы дать больше информации. Мне нужно знать, какая строка в настоящее время блокируется.

    SELECT 
 DB_NAME(resource_database_id)
 , s.original_login_name
 , s.status
 , s.program_name
 , s.host_name
 ,*
from 
 sys.dm_tran_locks dbl
  JOIN sys.dm_exec_sessions s ON dbl.request_session_id = s.session_id
where 
  resource_associated_entity_id = object_id('dbname.scheme.table')AND  DB_NAME(resource_database_id) = 'dbname'

Этот запрос работает для отображения, когда есть блокировка. Мне просто нужно немного больше информации. Например, таблица, на которую я смотрю, содержит много заказов. Если кто-то сидит в одном из этих заказов в приложении. Строка будет заблокирована, мне нужен запрос, чтобы показать порядковый номер заблокированной строки.

РЕДАКТИРОВАТЬ: Попытки ниже -

    select *
from db.scheme.table
where %%lockres%% in
(
select l.resource_description
from sys.dm_tran_locks as l
where l.resource_type in ('RID')
);

Выше возвращает строку I ' Я ожидаю, что он вернется, но он также вернет много старых строк в таблице, чего я бы не ожидал. Тем не менее, кажется, близко к тому, что мне нужно. С предложениями из ответа ниже я не смог заставить их вернуть какие-либо строки. Я чувствую, что утверждение о том, что было сказано выше, мне не хватает.

1 Ответ

1 голос
/ 07 апреля 2020

adho c %% lockres %% блокировки на уровне строк (не для постоянного мониторинга и т. Д. c.)

set transaction isolation level read uncommitted;

select *
from dbX.schemaY.tableZ 
where %%lockres%% in 
(
    select l.resource_description
    from sys.dm_tran_locks as l
    join sys.partitions as p on l.resource_associated_entity_id = p.partition_id
    where l.resource_type in ('KEY', 'RID')
    and p.object_id = object_id('dbX.schemaY.tableZ')
);

--demo
use tempdb
go

create table dbo.testtableX
(
    id int constraint pkclusteredid primary key clustered,
    thename nvarchar(128)
);
go

insert into dbo.testtableX(id, thename)
select object_id, name
from sys.objects
go

--select *
--from  dbo.testtableX;

--lock some rows
begin transaction
update dbo.testtableX with(rowlock)
set thename = thename+'update'
where id in (44, 45, 46)

--..or in another ssms windows
select 'locked rows', *
from dbo.testtableX with(nolock)
where %%lockres%% in
(
select l.resource_description
from sys.dm_tran_locks as l
where l.resource_type in ('KEY', 'RID') --index lock, KEY
);

select l.resource_description, *
from sys.dm_tran_locks as l
where l.resource_type in ('KEY', 'RID') --index lock, KEY

rollback transaction
go

--to heap
alter table dbo.testtableX drop constraint pkclusteredid;

--...repeat
begin transaction
update dbo.testtableX with(rowlock)
set thename = thename+'update'
where id in (54, 55, 56)

--..or in another ssms windows
select 'locked rows', *
from dbo.testtableX with(nolock)
where %%lockres%% in
(
select l.resource_description
from sys.dm_tran_locks as l
where l.resource_type in ('KEY', 'RID') --row identifier lock, RID
);

select l.resource_description, *
from sys.dm_tran_locks as l
where l.resource_type in ('KEY', 'RID') --RID

rollback transaction
go

drop table dbo.testtableX;
go
...