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

Откуда:
Сообщений: 6
Есть шаблон транзакции в которой тело генериуется приложением.
в последний месяц существенно увеличилось число сессий к базе и стали возникать ситуации когда надолго блокиуются таблицы потому уровень изоляции базы и транзакций был изменен на SNAPSHOT.

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
begin tran;
begin try
'- Динамический блок--------------------------------------------------------------
INSERT _post ( f1,f2,f3 )
values ('v1','v2','v3' )

update _inout set
actionID=4, actionack=1,actionackuser='apbdn',
actiondate=getdate(),actionackdate=getdate(),isfilled=1,
actionuser='User1',
where docnum='29756' and docid=2 and orgid=1012 and actionid=3 and Actionack is null and GivePersoneID is not null

insert _inout ( TransID,ovdid, ActionID,isfilled,ActionUser,ActionACKuser,ActionACK,ActionACKDate,ActionDate, DocID, DocNum,docproddate,fromovdid,GivePersoneID )
values ('{F11EA862-710B-40C8-B5B0-C163A3946A23}',40,4,1,'User1','User1',1,getdate(),getdate()+0.001,2,'29756','7-8-2009',1012,424)

'- Динамический блок--------------------------------------------------------------
commit tran;

end try

begin catch
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();
Rollback tran;
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
end catch

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

И собственно вопросы:
- Правильно ли построен шаблон транзакции?
- Можно ли более явно указать commit, чтоб сохранить то, что порционно забивалось и уже должно было таки применится.
- Был ли смысл менять уровень изоляции на SNAPSHOT?

И последний интересный эксперимент.
- У пользователя возникла ошибка по таймауту.
- он попытался вбить ту-же информацию еще раз... снова ошибка и так раз 5 в течении 15 минут.
- пользователь звонит.
- я запускаю трассировку, нахожу его инструкцию, пытаюсь выполнить... - висяк...
- нахожу подвисший блокирующий update и убиваю его.
- у меня транзакция применяется.
- звоню пользователю - у него тоже применилась, ( хотя я посчитал что это моя применилась наверное они прошли у обоих)
- Сегодняпользователь звонит потому-что ненаходит вчерашних данных.
- моя сессия подключением досих пор открыта, кусочек данных есть, а из вновь запущенной программы - нет.
- в своей сессии вызываю commit, и данные таки входят в базу (хотя он должен был быть вызван внутри исполняемого блока и выполнится).
19 сен 09, 16:16    [7682749]     Ответить | Цитировать Сообщить модератору
 Re: Изредка не сохраняются последовательные транзакции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
Ошибку таймаута надо обрабатывать на клиенте и откатывать транзакцию с него же, если она повисла.
19 сен 09, 18:00    [7682829]     Ответить | Цитировать Сообщить модератору
 Re: Изредка не сохраняются последовательные транзакции  [new]
sunflicker
Member

Откуда:
Сообщений: 6
Гавриленко Сергей Алексеевич
Ошибку таймаута надо обрабатывать на клиенте и откатывать транзакцию с него же, если она повисла.


Вы имеете в виду что если транзакция клиента отвалилась по таймауту, то необходимо сделаеть ей роллбек вручную, иначе все последующие аналогичные транзакции (которые в себе содержат коммит), не будут сохранены в базе? (т.е. станут вложенными для этой повисшей?)
20 сен 09, 17:13    [7684238]     Ответить | Цитировать Сообщить модератору
 Re: Изредка не сохраняются последовательные транзакции  [new]
sunflicker
Member

Откуда:
Сообщений: 6
Но ведь насколько я знаю MSSQL не поддерживает вложенных транзакций...
20 сен 09, 17:14    [7684240]     Ответить | Цитировать Сообщить модератору
 Re: Изредка не сохраняются последовательные транзакции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
sunflicker
Гавриленко Сергей Алексеевич
Ошибку таймаута надо обрабатывать на клиенте и откатывать транзакцию с него же, если она повисла.


Вы имеете в виду что если транзакция клиента отвалилась по таймауту, то необходимо сделаеть ей роллбек вручную, иначе все последующие аналогичные транзакции (которые в себе содержат коммит), не будут сохранены в базе? (т.е. станут вложенными для этой повисшей?)
Да. Тогда будет одна боольшая такая транзакция до первого роллбэка или окончания соединения.
20 сен 09, 18:56    [7684375]     Ответить | Цитировать Сообщить модератору
 Re: Изредка не сохраняются последовательные транзакции  [new]
sunflicker
Member

Откуда:
Сообщений: 6
Гавриленко Сергей Алексеевич
Да. Тогда будет одна боольшая такая транзакция до первого роллбэка или окончания соединения.

а как-же коммит в шаблоне транзакции.
он же должен ее завершить...
20 сен 09, 19:43    [7684436]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить