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

Откуда:
Сообщений: 72
Периодически возникает проблема.
База начинает жутко тормозить и отваливаться по таймауту.
По мониторингу видно, что у конкретного пользователя есть открытая транзакция, и если ее убить все нормализуется. Но как выяснить почему транзакция не завершена? Если смотреть по блокировкам, то все блокировки данной транзакции имеют статус GRANT, в активити мониторе никаких wait тоже нет. Открытая транзакция единственная, т.е. блокировать ее просто нечему.

( MS SQL 2005 )
20 ноя 12, 12:52    [13499551]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать чего ждет транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну так не задавайте таймаут
20 ноя 12, 12:55    [13499576]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать чего ждет транзакция.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
nApoBo3
Открытая транзакция единственная, т.е. блокировать ее просто нечему.

Может быть обратная ситуация — эта открытая транзакция блокирует других пользователей. Процесс, запустивший транзакцию, что-то делает или находится в состоянии sleeping? Если sleeping и транзакция открыта, то ищите ошибку в коде хранимых процедур или, например, пользовательского приложения.
20 ноя 12, 13:01    [13499609]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать чего ждет транзакция.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Немного раскрою мысль — может быть ситуация, что ХП или приложение открывает транзакцию, а commit/rollback не делает, в итоге на сервере повиснет открытая транзакция.
20 ноя 12, 13:05    [13499644]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать чего ждет транзакция.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
nApoBo3
Но как выяснить почему транзакция не завершена?
Для начала посмотрите статус sp_who2

Может действителдьно приложение элементарно не закрывает транзакцию.
20 ноя 12, 13:08    [13499675]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать чего ждет транзакция.  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Гость333
Немного раскрою мысль — может быть ситуация, что ХП или приложение открывает транзакцию, а commit/rollback не делает, в итоге на сервере повиснет открытая транзакция.


может. кто хранимке помешает сделать "begin tran; return"?
но сильно чаще косячит само приложение, явно управляя транзакциями
20 ноя 12, 13:19    [13499800]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать чего ждет транзакция.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Crimean
но сильно чаще косячит само приложение, явно управляя транзакциями

Согласен, к тому же, если предположить, что ХП неправильно управляет транзакциями, то делаем вывод — приложение скрывает информацию об ошибке "Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing". В любом из этих случаев ошибка как минимум в приложении :)
20 ноя 12, 13:26    [13499868]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать чего ждет транзакция.  [new]
может вообще
Guest
nApoBo3
База начинает жутко тормозить и отваливаться по таймауту.

что имеется ввиду? одно клиентское приложение на одном компьютере начинает тупить или все клиенты в ступор впадают?
может вообще клиентский код тупит, а не "база"?
20 ноя 12, 13:39    [13499992]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать чего ждет транзакция.  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Гость333
приложение скрывает информацию об ошибке


или эта ошибка маскируется другой, а приложение не показывает всю пачку ошибок
к примеру, CATCH блок не делает ROLLBACK
вот типовой пример:

use tempdb
go

create proc dbo.p1
as
set nocount on
begin tran
raiserror( 'Error from dbo.p1', 16, 1 )
return
go

select @@trancount as [before]
go

begin try
exec dbo.p1
end try
begin catch
declare @message nvarchar(2048) 
set @message = error_message()
raiserror( 'Error: %s', 16, 1, @message )
end catch
go

select @@trancount as [after]
go

if @@trancount <> 0 rollback
go

drop proc dbo.p1
go
20 ноя 12, 13:59    [13500200]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить