Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выявление блокировок program units  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
С таблицами всё понятно - пляшем от sys.dm_tran_locks. А вот как быть с процедурами и функциями? Пример:
create table dbo.t_test (n int);
insert into dbo.t_test values (1);

create function dbo.uf_test()
returns table as
return select n from dbo.t_test;

Сессия А:
begin tran;
update dbo.t_test set n=n+1;

Сессия B:
select * from dbo.uf_test();

Сессия С:
alter function dbo.uf_test()
returns table as
return select n+1 from dbo.t_test;

- сессия С висит, т.к. uf_test залочена запросом в сессии B, который висит из-за незакрытой транзакции в сессии А. Нужно найти, кто блокирует alter function dbo.uf_test.
Пока набросал вот такое:
Функция для парсинга dm_exec_requests.wait_resource:
alter function dbo.uf_SplitStringX (@StringToSplit varchar(100), @SplitChar varchar(10))
returns table
as return
with StringToSplit as (
  select
    0 n,
    ltrim( rtrim( substring( @StringToSplit, 1, charindex( @SplitChar, @StringToSplit ) - 1 ) ) ) Head
    , substring( @StringToSplit, charindex( @SplitChar, @StringToSplit ) + 1, len( @StringToSplit ) ) Tail
  union all
  select
    n+1,
    ltrim( rtrim( substring( Tail, 1, charindex( @SplitChar, Tail ) - 1 ) ) ) Head
    , substring( Tail, charindex( @SplitChar, Tail ) + 1, len( Tail ) ) Tail
  from StringToSplit
  where charindex( @SplitChar, Tail ) > 0
  union all
  select
    n+1,
    ltrim( rtrim( Tail ) ) Head
    , '' Tail
  from StringToSplit
  where charindex( @SplitChar, Tail ) = 0
  and len( Tail ) > 0
)
select n, Head piece from StringToSplit

и сам запрос:
SELECT
  exec_requests.session_id,
  locked_process.hostname locked_hostname,
  locked_process.program_name locked_program_name,
  locked_process.loginame locked_loginame,
  locked_sql.[text] locked_statement,
  obj.name object_name,
  obj.type_desc object_type,
  schema_name(obj.schema_id) object_schema,
  exec_requests.start_time, 
  exec_requests.status,
  exec_requests.command,
  exec_requests.blocking_session_id,
  blocking_process.hostname blocking_hostname,
  blocking_process.program_name blocking_program_name,
  blocking_process.loginame blocking_loginame,
  blocking_sql.[text] blocking_statement,
  exec_requests.wait_type,
  exec_requests.open_transaction_count,
  exec_requests.open_resultset_count
FROM sys.dm_exec_requests exec_requests
cross apply dbo.uf_SplitStringX(exec_requests.wait_resource, ':') split
join sys.all_objects obj on obj.object_id=split.piece
join sys.sysprocesses locked_process on locked_process.spid=exec_requests.session_id
cross apply sys.dm_exec_sql_text(exec_requests.sql_handle) locked_sql
join sys.sysprocesses blocking_process on blocking_process.spid=exec_requests.blocking_session_id
cross apply sys.dm_exec_sql_text(blocking_process.sql_handle) blocking_sql
WHERE
  exec_requests.wait_resource like 'OBJECT:%'
  and exec_requests.blocking_session_id <> 0
  and split.n=2

Может, можно как-то по-другому? Проще? Можно как-то обойтись без парсинга четырехкомпонентного значения wait_resource в CTE?
2 июл 14, 08:11    [16246690]     Ответить | Цитировать Сообщить модератору
 Re: Выявление блокировок program units  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
автор
Нужно найти, кто блокирует alter function


sp_who2 [spid сессии С]
2 июл 14, 09:58    [16247052]     Ответить | Цитировать Сообщить модератору
 Re: Выявление блокировок program units  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
автор
alter function dbo.uf_test

Надеюсь, у Вас на этом бизнес-логика не построена.
2 июл 14, 13:00    [16248416]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить