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

Откуда: Russia, Vladivostok
Сообщений: 157
время от времени, не часто, но такое бывает, у меня "подвешиваются" транзакции, друг друга блокируют, и встает вся база, т.к. на таблицы вешаются блокировки. как временный вариант, до выяснения причины блокировок и их устранения, хочу автоматизировать процесс "киляния" транзакций. сейчас это произвожу следующим образом:
1. dbcc opentran - @spid юзера + время открытия транзакции @t. если @t > 2-3 минут, явный висяк.
2. sp_who @spid - выяснение, кто "подвис"
3. kill @spid - все "отвешиваются", у юзера пропадают данные с времени @t
4. звонок юзеру, для его информирования о том, что последнее, что он делал, "пропало".
а хочется по другому:
1. автоматом отлавливать транзакции, у которых время выполнения > 2-3 минут
2. Закинуть информацию о подвисшей транзакции в таблицу для последующего анализа
3. kill этой транзакции + Кинуть себе сообщение NetSend-ом, ну или намылить через SQL Mail. + если бы еще и юзеру NetSend послать как нибудь, было бы вообще здорово

больше всего интересует пункт 1. с какой стороны лучше всего подойти? стоит ли ковырять master.dbo.sysprocesses ?
27 июл 04, 10:33    [837035]     Ответить | Цитировать Сообщить модератору
 Re: Хочу автоматом делать kill на "подвисшие" транзакции  [new]
kosmatos
Member

Откуда: Тверь
Сообщений: 7
dbcc opentran, насколько я понимаю, возвращает информацию о самой старой транзакции. она не обязательно кого-то блокирует (у нас по крайней мере так). может имеет смысл искать именно блокирующий процесс, вернее корень в дереве блокировок. ждать какое-то время, и , если корневой процесс не отрабатывает, килять его.

сам делаю так (вручную в QA):
if (object_id('tempdb..##proc') is not null)
exec(N'drop table tempdb..##proc')

select distinct
[Process ID] = p.spid,
[Blocked By] = p.blocked,
[Blocking] = 0,
[Host] = p.hostname,
[User Name] = p.nt_username,
[Application]= p.program_name
into ##proc
from master.dbo.sysprocesses p with (NOLOCK)
--where db_name(p.dbid) like 'TaxesTrNew'
order by p.spid

update ##proc
set [Blocking] = 1
where [Process ID] in (select [Blocked By] from ##proc where [Blocked By] > 0)

select
P.[Process ID],
P.[Blocking],
P.[Blocked By],
P.[Application],
P.[Host],
P.[User Name]
from ##proc P
where ((P.[Blocking] > 0)or(P.[Blocked By] > 0))
order by P.[Blocking], P.[User Name]

if (object_id('tempdb..##proc') is not null)
exec(N'drop table tempdb..##proc')

строка с Blocking=1 и Blocked=0 - это кандидат на kill.
например, выполнять запрос периодически (как job), замечать блокирующий, включать таймер и убивать по истечении нужного периода времени.

С уважением, Илья.
27 июл 04, 13:34    [838217]     Ответить | Цитировать Сообщить модератору
 Re: Хочу автоматом делать kill на "подвисшие" транзакции  [new]
SergDanceHits
Member

Откуда: Russia, Vladivostok
Сообщений: 157
2 kosmatos
превеликий сенькс
значит я в правильную сторону думал (master.dbo.sysprocesses)
27 июл 04, 13:59    [838354]     Ответить | Цитировать Сообщить модератору
 Re: Хочу автоматом делать kill на "подвисшие" транзакции  [new]
kosmatos
Member

Откуда: Тверь
Сообщений: 7
тока повторюсь - сам отслеживаю блокировки вручную, по звонку от пользователей, мол висим. тогда пускаю скрипт и смотрю, кто виноват. автоматом убивать что-то уж больно стрёмно.

С уважением, Илья.
27 июл 04, 14:43    [838585]     Ответить | Цитировать Сообщить модератору
 Re: Хочу автоматом делать kill на "подвисшие" транзакции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Наверное все же правильнее избегать мертвых блокировок, чем килять процессы.
Встречал такую ситуацию:

Джоб налетает на процесс с подлинкованного сервера, который ожидает когда для юзера закончится не очень длинная транзакция.
Все трое встают и ждут, а к ним по нарастающей присоединяются остальные пользователи по одному.
Так вот к тому моменту, когда это становится заметно, предпринимать что либо уже поздно.
Киляются заклинившие процессы джобов на обоих серверах, но это не помогает. Для обоих процессов исполняется откат но этому мешают остальные ждущие транзакции и висяк продолжается. Убитые пользователи так же встают в очередь на откат с тем же результатом.
При этом время ожидания полного отката превышает время рестарта сервиса, а может быть и равно бесконечности (проверить не хватает терпения пользователей :)

Так что еще раз повторюсь, ИМХО лучше постораться избегать подобного чем рубить с плеча.
27 июл 04, 14:48    [838621]     Ответить | Цитировать Сообщить модератору
 Re: Хочу автоматом делать kill на "подвисшие" транзакции  [new]
SergDanceHits
Member

Откуда: Russia, Vladivostok
Сообщений: 157
дык я и хочу это сделать временно, а потом спокойно разбираться, что к чему. самому постоянно отслеживать висяки практически нереально, а когда юзера позвонят - уже поздно :). Дело в том, что эти висяки очень странно себя ведут на клиенте. у юзера на эране все в порядке! например, создал заказ, распечатал его, а реально транзакция все еще висит! и этот юзер вешает абсолютно всех. поэтому, чем меньше времени пройдет с момента "подвисания" до килла, тем меньше данных у него пропадет, т.к. при откате у него все пропадает. + Быстрее база "отомрет".
клиент - Delphi+ADO. Кстати, тема, неясная абсолютно, где глюк. Т.к. по идее, у клиента должна вываливаться ошибка, хотя бы тот же TimeOut. Однако, дельфя преспокойно это дело пропускает, и пускает клиента дальше, несмотря на то ,что транзакция еще не завершилась. Короче, надо искать, где собака порылась, где глюк, Дельфи, АДО или Скуль.
27 июл 04, 15:28    [838890]     Ответить | Цитировать Сообщить модератору
 Re: Хочу автоматом делать kill на "подвисшие" транзакции  [new]
SergDanceHits
Member

Откуда: Russia, Vladivostok
Сообщений: 157
это проблемса так и не решена вот тут
там единственная неточность - даже если клиент сам выйдет из программы, то изменения не сохранятся. один хрен все откатывается. как и при килле
27 июл 04, 15:33    [838927]     Ответить | Цитировать Сообщить модератору
 Re: Хочу автоматом делать kill на "подвисшие" транзакции  [new]
SergDanceHits
Member

Откуда: Russia, Vladivostok
Сообщений: 157
kosmatos
тока повторюсь - сам отслеживаю блокировки вручную, по звонку от пользователей, мол висим. тогда пускаю скрипт и смотрю, кто виноват. автоматом убивать что-то уж больно стрёмно.
С уважением, Илья.

ну автоматом может я и погорячился. килять скорее всего буду вручную, но хочу раньше знать о висяке, прежде чем мне юзера начнут звонить. А вот ежели меня на рабочем месте не будет по какой причине, то тут можно и на автомат поставить. а то блин, лежишь на Шаморе, загораешь, а тут тебе начинают названивать, все повесилось, караул!! приезжай.
27 июл 04, 15:39    [838972]     Ответить | Цитировать Сообщить модератору
 Re: Хочу автоматом делать kill на "подвисшие" транзакции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
SergDanceHits
это проблемса так и не решена вот тут
там единственная неточность - даже если клиент сам выйдет из программы, то изменения не сохранятся. один хрен все откатывается. как и при килле


Такое уже где-то было в форуме и причина нашлась. Где -то в процедуре, вызываемой из клиента, открывается транзакция и процедура прерывается аварийно, ошибка прерывающая батч немедленно. Соответственно остается открытая транзакция после выхода из процедуры, со всеми вытекающими.
В качестве решения, предлагалось после каждого вызова ХП (или того, что выполнился с ошибкой, если удается перехватить) выполняется откат транзакций.
Если у тебя откатываются явно проведенные действия юзера, после закрытия соединения, то это твой случай!
27 июл 04, 16:05    [839163]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить