Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Транзакции в процедурах, ASA 6 / 5 сообщений из 5, страница 1 из 1
03.06.2004, 15:29
    #32546918
Akni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции в процедурах, ASA 6
Добрый день всем.

Сервер ASA 6.04, работает в режиме неявных транзакций.
Такая ситуация: есть две хранимые процедуры такого вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 --------- выбор всех клиентов, соответсвующих опред. условию
 

CREATE  PROCEDURE usr.spMakeBills(…)
BEGIN
        FOR Customer AS Curs  CURSOR FOR
	select distinct C.idCustomer from usr.tblCustomer C 
	inner join ….
	where …
           DO
                 ---- выставление счета клиенту   
 

                call usr.spMakeBillForCustomer(idCustomer, …);
           END FOR;
END;

CREATE  PROCEDURE usr.spMakeBillForCustomer(…)
BEGIN
…
END;

Если выполнение usr.spMakeBills(…) прервать, то все сделанные изменения будут отменены. Хотелось бы, однако, при прерывании выполнения процедуры, чтобы уже посчитанные счета сохранялись.

Попробовала код процедуры usr.spMakeBillForCustomer(…) обрамить в блок BEGIN TRAN … COMMIT TRAN :

Код: plaintext
1.
2.
3.
4.
5.
CREATE  PROCEDURE usr.spMakeBillForCustomer(…)
BEGIN
	BEGIN TRANSACTION
              …
	COMMIT TRANSACTION
END;

Однако уже при компиляции процедуры выдается сообщение «синтаксическая ошибка возле TRANSACTION»

Вопрос: каким образом можно добиться того, чтобы результаты выполнения вложенных процедур не откатывались при прерывании внешней процедуры?
...
Рейтинг: 0 / 0
03.06.2004, 15:47
    #32546983
L0cat0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции в процедурах, ASA 6
а просто Commit в конце процедуры spMakeBillForCustomer ?
...
Рейтинг: 0 / 0
03.06.2004, 15:55
    #32547010
Akni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции в процедурах, ASA 6
честно говоря, экспериментальным путем пока не пробовала.
Но, согласно хелпу, просто Commit заканчивает одну логическую единицу (транзакцию), и делает все изменения, которые во время этой транзакции произошли в БД, постоянными.

так вот, что в этом случае понимается под транзакцией? Сервер работает в режиме неявных транзакций, т.е. каждый insert, update, delete - одна транзакция.

в случае BEGIN TRAN … COMMIT TRAN должен полностью выполниться или не выполниться целый блок.
А что закоммитится в случае просто одного Commit в конце процедуры?
...
Рейтинг: 0 / 0
03.06.2004, 16:20
    #32547076
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции в процедурах, ASA 6
авторСервер работает в режиме неявных транзакций, т.е. каждый insert, update, delete - одна транзакция.

в случае BEGIN TRAN … COMMIT TRAN должен полностью выполниться или не выполниться целый блок.
А что закоммитится в случае просто одного Commit в конце процедуры?
Ваше утверждение будет истинным только при условии, что включен режим AutoCommit, т.е. опция БД CHAINED установленна в значение OFF. По умолчанию эта опция выставленна в ON, т.е. для старта транзакции не нужен BEGIN TRAN, достаточно выполнить insert, update или delete, а конец транзакции определяет программист явным COMMIT или ROLLBACK.

авторА что закоммитится в случае просто одного Commit в конце процедуры?
Так что при включенной опции (что скорее всего у Вас и есть) в начале процедуры у вас будет неявно стартовать транзакция, но явно с Вашей помощью при вызове COMMIT завершаться, что собственно говоря Вам и требуется. На текущий же момент все Ваши изменения получаются проходят в пределах одной транзакции, т.е. если Вы в ISQL напишите такой код:
Код: plaintext
1.
CALL spMakeBills ();
ROLLBACK;
то думаю будете удивлены результатом его выполнения - все изменения будут откачены.
...
Рейтинг: 0 / 0
03.06.2004, 17:26
    #32547301
Akni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции в процедурах, ASA 6
to ASCRUS
спасибо за исчерпывающий ответ
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Транзакции в процедурах, ASA 6 / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]