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

Откуда: Москва
Сообщений: 311
Всех приветствую.

Сисадмины, разработчики, подскажите пожалуйста вот что, т.к. на работе столкнулся вот с какой проблемой.

Пользователь1 работает в системе, выполняя различные действия.

Пользователи2,3,4 также в ней работают

И вдруг другие пользователи понимают, что у них система зависла.
Посмотрев информацию по серверу, мы понимаем что Пользователь1 всех завесил и у него открыта транзакция, которая блочит всех остальных на работу с этой таблицей.

Т.е. на практике это так:
Пользователь1 запустил процедуру A1. Транзакция открылась. Закрылась.
Пользователь1 запустил процедуру A2. Транзакция открылась. Закрылась.
Пользователь1 запустил процедуру A3. Транзакция открылась. Не закрылась т.к. появилась ошибка, и в результате некорректного написанного кода, она не откатилась.
Пользователь1 запустил процедуру A4. Транзакция открылась. Закрылась.
Пользователь1 запустил процедуру A5. Транзакция открылась. Закрылась.

И всё. Следовательно Пользователь1 завесил всех остальных и заблокировал используемые им таблицы.

Возможно ли средствами SQL, логов, трассировки узнать точное место(код,процедуру) которая у пользователя1 оставила открытую транзакцию, но не закрыла ее?

Пользователь1 мог сделать после факта обнаружения зависшей транзакции 100 действий.

Есть ли механизм,скрипты,процедуры, которую смогут мне выдать информацию примерно в таком виде:
Пользователь 1 в 12:00 запустил процедура А3, Транзакцию открыл, но не закрыл. Она висит Х секунд/минут/часов, значит именно в этой процедуре произошел какой-то косяк.

Возможно ли так подробно получать логи и как это возможно сделать?
2 апр 15, 15:37    [17464976]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9184
Hamber,

напишите обработчики ошибок в процедурах и будет Вам счастье. Все, что вы хотите в своем сообщении, будет ненужным.
2 апр 15, 15:53    [17465083]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
Hamber
Member

Откуда: Москва
Сообщений: 311
В данном аспекте я спрашиваю возможно ли получить эти данные и как.

Вариант переписать код, вставить обработчик, "убить" программиста :), научить правильно и грамотно программировать - не подходит.

Если что, то:
SELECT @@VERSION

Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86)   Dec 10 2010 10:56:29   Copyright (c) 1988-2005 Microsoft Corporation  Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
2 апр 15, 15:57    [17465128]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32175
Hamber
Возможно ли средствами SQL, логов, трассировки узнать точное место(код,процедуру) которая у пользователя1 оставила открытую транзакцию, но не закрыла ее?
Встроенного логирования такого рода у сиквела нет, слишком это накладно.

Можно либо сделать такое самому, профайлером, либо сделать контроль в приложении (тогда будет падать производительность).
2 апр 15, 16:12    [17465225]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
alexeyvg
Hamber
Возможно ли средствами SQL, логов, трассировки узнать точное место(код,процедуру) которая у пользователя1 оставила открытую транзакцию, но не закрыла ее?
Встроенного логирования такого рода у сиквела нет, слишком это накладно.

Можно либо сделать такое самому, профайлером, либо сделать контроль в приложении (тогда будет падать производительность).

можно выставить флаги трассировки для фиксации дедлоков в журнал, если это они приводят к такой ситуации то можно будет разобраться после инцидента, а если нет, то отсечь по крайней мере эту версию.
2 апр 15, 16:48    [17465521]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Может вот этим увидите? Имя процедуры и план показывает.
2 апр 15, 16:59    [17465604]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
Crimean
Member

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

в еще более сложной ситуации в этой же квере апосля кенсела еще и "поработали"
2 апр 15, 17:39    [17465874]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
o-o
Guest
stavgreengo
можно выставить флаги трассировки для фиксации дедлоков в журнал, если это они приводят к такой ситуации то можно будет разобраться после инцидента, а если нет, то отсечь по крайней мере эту версию.

дедлоки не висят часами,
а то, что висит, в еррорлог этими флагами не запишешь
2 апр 15, 17:46    [17465902]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9184
Вы потратите намного больше времени на поиски виновного, чем на добавление обработчика ошибок в каждую из 2000 процедур.
2 апр 15, 18:19    [17466054]     Ответить | Цитировать Сообщить модератору
 Re: Поиск процедуры, которая привела к зависшей транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32175
stavgreengo
можно выставить флаги трассировки для фиксации дедлоков в журнал, если это они приводят к такой ситуации то можно будет разобраться после инцидента, а если нет, то отсечь по крайней мере эту версию.
Про дедлоки сервер пишет, так что, наверное, не в них дело.
Владислав Колосов
Вы потратите намного больше времени на поиски виновного, чем на добавление обработчика ошибок в каждую из 2000 процедур.
А в одно место в приложении обработчик поставить ещё проще :-)
Или писать приложение в популярном сейчас стиле "один запрос - один коннект".
2 апр 15, 20:00    [17466478]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить