Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что происходит с транзакцией запущенной на сервере если ADOComman [D6, D7, MSSQL, mssql2000]


jocko ©   (2004-01-17 13:01:00) 

Собственно хотелось бы знать сталкивался ли кто с такой проблемой.
В списке блокировок видим пользователей, у которых есть несколько незавершенных транзакций,на клиенте транзакции не открываются,
серверные процедуры уже перепроверены, источник не нашли, везде есть commit или rollback (кажется :( ),
из множества серверов проблемы только на одном, причем самом нагруженном и то видимо в часы максимальной
нагрузки. Единственная мысль изложена в subject.
Может у кого есть идеи...


Nikolay M.   (2004-01-19 10:15:00) [1]


> Что происходит с транзакцией запущенной на сервере если
> ADOCommand "отвалился" по timeout?

Может, я не совсем в сути дела, но у меня при вызове след. ХР вылета по таймауту (в ADOCommand & ADOConnection тайминги минимальны) не произошло, процедура работает около минуты.
Имхо, после запуска ХР на сервере (не)существование коннекта с клиентом на ее работу уже никакого влияния не имеет. Просто на клиенте посыпятся ошибки, а процесс, запущенный на сервере, отработает до конца. А закоммитится он или откатится - это уже зависит от логики ХР.

CREATE PROC pTest
AS

DELETE FROM tTest

BEGIN TRANSACTION

DECLARE
@i integer,
@j integer

SELECT @j = 0
WHILE (@j < 1000)
BEGIN
SELECT
@i = 0
WHILE (@i < 20000)
SELECT @i = @i + 1
SELECT @j = @j + 1
INSERT INTO tTest (f1) VALUES (@j)
END

COMMIT TRANSACTION


KSergey   (2004-01-17 14:41:00) [2]

Ну в принципе, если более 30 сек считать нормальным для задачи - то может увеличить? Благо ADOCommands это позволяет.
А вообще действительно интересно: что делает сервер с запущенным SQL Batch, если пользователь отвалился? Может кто из монстров подскажет...
Если вы зададите этот вопрос а sql.ru, скажем, киньте сюда ссылку - инетесно что ответят.


jocko   (2004-01-17 14:22:00) [3]

используются только ХП


jocko   (2004-01-17 14:21:00) [4]

команда выполняется дольше 30 сек
на клиенте транзакции не открываются


KSergey   (2004-01-17 14:06:00) [5]

Смотря что происходит в программе при этом "отваливании".

Впрочем, не совсем понятно что значит "ADOCommand "отвалился" по timeout". Рвется соединение с сервером или команда просто выполняется больше таймаута?
А где транзакция-то открыта? В ХП или c клента?
1.Если с клиента.
Если рвется соединение с сервером - то транзакция собственно и останется висеть. И не снять ее часто, увы. Если просто выскакивает Exception про таймаут - то, видимо, просто обработать его и откатить транзакцию.
2.Если с сервера (в ХП или запросе)
Думаю, ХП или запрос таки будут дорабатывать до конца не смотря на то, что клиента это уже не интересует, хотя, сказать честно, в этом уже не уверен. Это я не четко знаю.

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


jocko   (2004-01-17 13:40:00) [6]

Что происходит с транзакцией запущенной на сервере если ADOCommand "отвалился" по timeout?


Наверх

Титульная страница Поиск, карта сайта Написать письмо