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

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

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

в случае BEGIN TRAN … COMMIT TRAN должен полностью выполниться или не выполниться целый блок.
А что закоммитится в случае просто одного Commit в конце процедуры?
...
Рейтинг: 0 / 0
Транзакции в процедурах, ASA 6
    #32547076
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСервер работает в режиме неявных транзакций, т.е. каждый 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
Транзакции в процедурах, ASA 6
    #32547301
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to ASCRUS
спасибо за исчерпывающий ответ
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Транзакции в процедурах, ASA 6
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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