powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Проблема с транзакциями в ASA
36 сообщений из 36, показаны все 2 страниц
Проблема с транзакциями в ASA
    #33294571
th0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую всех.

Начал изучать ASA (нравится все больше и больше, кстати) и столкнулся с крайне странной проблемой.
Пусть имеется таблица (пустая):
Код: plaintext
1.
create table t (a integer not null primary key);

Теперь вставляем записи внутри транзакции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
begin tran;
insert t values ( 1 );
insert t values ( 2 );
insert t values ( 2 ); -- ошибка
insert t values ( 100 );
insert t values ( 101 );
commit;

На третьем insert'e возникает ошибка primary key not unique, как и должно быть. Но первые 2 записи остаются в таблице, т.е. транзакция не откатывается!

Еще интереснее, что если вводить все это в текстовом режиме (dbisql -nogui), то вставляются и записи после ошибки.

Для сравнения, на том же PostgreSQL все работает как надо (после отката транзакции по ошибке таблица пустая).

'Begin просто' вместо 'begin tran' не пишу. Пробовал и ; и go и без оных. Про опцию Auto_commit в dbisql читал, она выключена. Пробовал и своей программкой через JDBC с conn.setAutoCommit(false) - та же фигня (нет только той записи, где повторяется ключ).
В документации про это как-то невнятно.

Так что sos :(
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294574
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему транзакция должна откатываться?
Если во время транзакции пришла ошибочная команда это не повод отменить всю транзакцию.
Хочешь отменить транзакцию - давай команду rollback.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294576
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А то что ты хочешь сделать делается командой
Код: plaintext
1.
2.
3.
4.
5.
6.
begin atomic
   insert .....;
   insert .....;
   insert .....;
   insert .....;
   insert .....;
end;
Вот тогда ошибка внутри блока отменит все что происходило в блоке до нее.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294578
th0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlА почему транзакция должна откатываться?
Если во время транзакции пришла ошибочная команда это не повод отменить всю транзакцию.
Хочешь отменить транзакцию - давай команду rollback.

А как же принцип атомичности - выполняются все команды или ни одна команда?
Если не выполнилась хотя бы одна - не должны сохраниться изменения ни от тех, что были до (в транзакции), ни от тех, что после... Или нет?

Вот и из документации:


You can group SQL statements into transactions, which have the property that either all statements are executed or none is executed.


дока
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294585
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, все правильно. Просто транзакцию надо завершать, либо commit'ом, либо
rollback'ом. А до момента вызова одного из них, данные в таблице будут
по-любому. Клиент должен проверять код ошибки, и если сервер ругнулся на
что-то и Вам нужна атомарность(а она ведь может и не нужна в этом месте,
зависит от задачи), то тогда вызвать rollback, иначе commit.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294586
th0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iLLer
Ну, все правильно. Просто транзакцию надо завершать, либо commit'ом, либо
rollback'ом. А до момента вызова одного из них, данные в таблице будут
по-любому. Клиент должен проверять код ошибки, и если сервер ругнулся на
что-то и Вам нужна атомарность(а она ведь может и не нужна в этом месте,
зависит от задачи), то тогда вызвать rollback, иначе commit.


Данные остаются именно после commit :) А проверка ошибок не всегда возможна - что если
у меня просто script.sql с кучей insert'ов, которые должны либо залиться, либо не залиться, иначе будет винегрет?
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294588
th0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlА то что ты хочешь сделать делается командой
Код: plaintext
1.
2.
3.
4.
5.
6.
begin atomic
   insert .....;
   insert .....;
   insert .....;
   insert .....;
   insert .....;
end;
Вот тогда ошибка внутри блока отменит все что происходило в блоке до нее.

begin atomic работает. Но философский вопрос остается :) Вот что нашлось:


> Are there any guidelines as to when to use BEGIN ATOMIC or BEGIN TRAN? It
> seems that basically the same things can be accomplished with both: having
> an atomic compound statement... Or am I missing something.

Afaik, BEGIN ATOMIC is per statement batch only.

A transaction can contain multiple statement batches.

This is how I see it.

из кеша Google

Т. е. нет принципиальной разницы, и почему транзакция не работает - непонятно...
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294594
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
th0rnТ. е. нет принципиальной разницы, и почему транзакция не работает - непонятно...
Вот как раз принципиальная разница и есть. Ты путаешь транзакцию и атомарные блоки. В ASA это две разные вещи.
Транзакция это блок команд, который начинается явной или неявной командой begin tran и заканчивается командами commit или rollback .
Атомарный блок - блок команд начинающийся командой begin atomic и заканчивающийся командой end .
Ошибка внутри транзакции не делает автоматического отката на начало транзакции. Ошибка внутри атомарного блока делает откат на начало блока.
Как это сделано в других серверах в данное время совершенно не важно. В ASA это именно так. Есть begin tran, есть begin atomic. Что в данный момент нужно, то и используешь.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294595
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
th0rnДанные остаются именно после commit :) А проверка ошибок не всегда возможна - что если у меня просто script.sql с кучей insert'ов, которые должны либо залиться, либо не залиться, иначе будет винегрет?
В начало скрипта ставишь begin atomic, в конец end; и наслаждаешься.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294598
th0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
В начало скрипта ставишь begin atomic, в конец end; и наслаждаешься.
Cпасибо, буду пользоваться.

Кстати, сейчас запустил ASE - такое же поведение. (А begin atomic там вроде нет).
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294791
Jager
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может немного и не в тему, но также вопрос по транзакциям...
Sybase ASa v9.0.2.3137
Код: plaintext
1.
2.
3.
4.
5.
6.
    declare lNumber varchar( 20 );
    declare lGenerator integer;
    set option chained = 'ON';
    start tran;
        SELECT NumGeneratorID INTO lGenerator FROM list_DirectionDocTypeGenerator 
        WHERE DocumentTypeID = inDocumentType AND DirectionID = inDirection;
Текст хранимой процедуры. При добавлении строки
Код: plaintext
    start tran;
хранимка не хочет сохраняться, выдавая ошибку
Sybase ASAСинтаксическая ошибка около 'tran' подсоединено 13
SQLCODE: -131
SQLSTATE: 42000
Если это возможно, просьба объяснить, не отсылая в BOL. :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294875
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во первых не START TRAN, а BEGIN TRAN. Во вторых стоит помнить, что BEGIN TRAN относиться к ХП на TSQL. Если процедура компилируется как WatcomSQL, то у него нет оператора BEGIN TRAN и считается, что любой DML оператор или SavePoint неявно стартует транзакцию (фактически, как для TSQL включить опцию CHAINED=ON).

Кстати я не совсем понимаю, зачем на SELECT стартовать транзакцию, даже если и ХП переписать на TSQL - какой в этом смысл ?

И еще замечание по коду:
Код: plaintext
set option chained = 'ON';
установит в ХП опцию для текущего пользователя сессии как постоянную. То же непонятно, зачем это делать. Если Вы хотите, чтобы для пользователя эта опция всегда была включена, то просто поставьте ее один раз на него. Если хотите, чтобы для всех пользователей, то поставьте ее на PUBLIC. Если хотите временно изменить значение опции, то пишите SET TEMPORARY OPTION. Это не MSSQL, где каждый раз опции нужно в сессии явно указывать или уповать, что он вместе с процедурой правильно их скомпилирует.

P.S. Ну и напоследок - если проект не будет совместимым с MSSQL или ASE, то рекомендую вообще TSQL не пользоваться и писать все исключительно на WatcomSQL. Больше возможностей, меньше путаницы в диалектах. И все таки почитать BOL, как бы Вы не хотели, чтобы Вас туда не отсылали ;)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294932
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
th0rn

Теперь вставляем записи внутри транзакции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
begin tran;
insert t values ( 1 );
insert t values ( 2 );
insert t values ( 2 ); -- ошибка
insert t values ( 100 );
insert t values ( 101 );
commit;

На третьем insert'e возникает ошибка primary key not unique, как и должно быть. Но первые 2 записи остаются в таблице, т.е. транзакция не откатывается!


Правильно, и не должна. С какого фига вся транзакция должна откатываться ?
Ты можешь проверить вставилась ли очередная запись и откатить все, если тебе нужно. А зачем еще ручное управление транзакциями нужно ?

Но кстати интересно что на этот счет в стандарте SQL прописано -- надо посмотреть. Это к тому, что один кто-то из двух (ASA или PosgreSQL) работают не по стандарту. (на самом деле кстати ASE и MSSQL работают так же как ASA.)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294961
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
th0rn
А как же принцип атомичности - выполняются все команды или ни одна команда?
Если не выполнилась хотя бы одна - не должны сохраниться изменения ни от тех, что были до (в транзакции), ни от тех, что после... Или нет?


Чувствуется, что ты начитался стандартных (в смысле - "из стандарта" SQL) "умных" слов и вот теперь ...
Это -- всего лишь теория, лишь определение транзакции, а на практике все зависит от реализации конкретного сервера БД.
В большинстве серверов, кстати, ты можешь путем ручного управления транзакциями даже как бы нарушить ее атомарность - закоммитить например только часть изменений транзакции, а другую часть отменить.
Пример простой -- берешь напр. пишешь триггер на вставку, и удаляешь в нем каждую вторую вставленную запись.
Тут просто надо "атомарность" понимать в том смысле, что это атомарность , нужная приложению.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33294973
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Кстати я не совсем понимаю, зачем на SELECT стартовать транзакцию, даже если и ХП переписать на TSQL - какой в этом смысл ?

Выборка (чтение) данных - тоже транзакция, все правильно, надо стартовать транзакцию. Это и соответствует ANSI, и логично -- ты же можешь на основе этих данных потом делать UPDATE/DELETE/INSERT.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33295017
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv ASCRUS
Кстати я не совсем понимаю, зачем на SELECT стартовать транзакцию, даже если и ХП переписать на TSQL - какой в этом смысл ?

Выборка (чтение) данных - тоже транзакция, все правильно, надо стартовать транзакцию. Это и соответствует ANSI, и логично -- ты же можешь на основе этих данных потом делать UPDATE/DELETE/INSERT.
То есть в TSQL если явно не стартовать транзакцию, то SELECT на высоком уровне изоляции поставит блокировки только на время выполнения SELECT-а, а потом их снимет ? В WatcomSQL немножко проще, там нет явного старта транзакций, поэтому SELECT повесит блокировки до явного COMMIT или ROLLBACK, вне зависимости от того, были дальше DML операторы или нет. Кстати в ASA нет понятия вложенных транзакций, есть SAVEPOINT и атомарные блоки (фактически это те же самые SAVEPOINT, только организующиеся автоматом для атомарных блоков). Зато никто не ругается, если сделать лишний разок на всякий случай COMMIT или ROLLBACK, даже если и не было старта транзакции.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33295069
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
То есть в TSQL если явно не стартовать транзакцию, то SELECT на высоком уровне изоляции поставит блокировки только на время выполнения SELECT-а, а потом их снимет ?
При чем здесь TSQL или Watcom? Это стандарт SQL, ANSI. Всё это поведение описывается им, в обоих случаях AUTOCOMMIT .
Если интересуют именно подробности работы ASE -- так там практически то же самое, что ты написал.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33295091
Jager
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUSНу во первых не START TRAN, а BEGIN TRAN. Во вторых стоит помнить, что BEGIN TRAN относиться к ХП на TSQL. Если процедура компилируется как WatcomSQL, то у него нет оператора BEGIN TRAN и считается, что любой DML оператор или SavePoint неявно стартует транзакцию (фактически, как для TSQL включить опцию CHAINED=ON)...
BOL читаю, без этого, ясное дело, никуда, просто вопрос близко к теме получился...
А вот можно ли попросить уважаемых метров написать что-то типа краткого FAQ по данному разделу (atomic-блоки, транзакции в W-SQL и T-SQL, их различие)? Как оказывается, это довольно интересная (особенно для начинающих) тема.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33295152
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте чуть позже. Мы доделываем сайт RU-SUG, уже форум приличный прикрутили и как начнем перенос материалов, заодно будем и новые материалы выкладывать параллейно для RU-SUG, FAQ SQL.RU и рассылке по ASA. Кстати это еще придется с Judge обсуждать, как лучше интегрировать портал пользователей Sybase с SQL.RU, чтобы мы были партнерскими, а не конкурирующими сайтами и что делать с форумами - судя по последним переговорам с Judge обьединить их вряд ли удасться, а у нас форумы однозначно круче и удобнее для пользователей и модераторов. Плюс будут форумы по каждому продукту в отдельности, однако не хотелось бы разрывать SQL.RU с порталом, будем думать :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33296761
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSВ WatcomSQL немножко проще, там нет явного старта транзакций,
ээээ... месье, транзакции это поведение сервера а не фича какого-то из диалектов.

ASCRUSКстати в ASA нет понятия вложенных транзакций,
Ну здрасте, вчера еще только были :) Есть вложеные транзакции в ASA, есть.
Открывай BOL и читай BEGIN TRANSACTION

ASCRUSЗато никто не ругается, если сделать лишний разок на всякий случай COMMIT или ROLLBACK, даже если и не было старта транзакции.
А тогда первая же команда после commit/rollback начнет неявно новую транзакцию если количество вложеных транзакций дошло до нуля :)

Вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
message @@trancount to client;
BEGIN TRANSACTION;
message @@trancount to client;
BEGIN TRANSACTION;
message @@trancount to client;
COMMIT;
message @@trancount to client;
COMMIT;
message @@trancount to client;
update sometable set f1= 1 ;
message @@trancount to client;
COMMIT;
message @@trancount to client;
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33296828
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JagerА вот можно ли попросить уважаемых метров написать что-то типа краткого FAQ по данному разделу (atomic-блоки, транзакции в W-SQL и T-SQL, их различие)? Как оказывается, это довольно интересная (особенно для начинающих) тема.
Ну чем отличаются транзакции от атомарных блоков я уже писал чуть выше в этом же топике. Главная разница между транзакцией и атомарным блоком - если произошла ошибка внутри транзакции, то сервер откажется выполнять только ошибочную команду, все остальные команды в транзакции будут выполнены. Одна ошибочная команда внутри атомарного блока отменяет все команды включеные в этот атомарный блок.
От используемого диалекта это не зависит.

Транзакции в ASA могут вложеными, начинаешь транзакцию командой BEGIN TRANSACTION, завершаешь COMMIT/ROLLBACK. Просто commit/rollback завершит ближайшую транзакцию текущего уровня вложенности. Можно транзакциям нулевого уровня давать имена и тогда commit/rollback с указаным именем транзакции завершит все уровени вложенности вплоть до начала указаной именованой транзакции. Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin transaction TransactionLabel;
insert into #t values( 1 , 2 , 3 );
begin transaction;
insert into #t values( 4 , 5 , 6 );
if @aaa= 1  then
   commit;
   commit;
else
   commit TransactionLabel;
end if;
Зачем это может быть нужно - очень сложный вопрос если честно :)

Кроме этого в ASA есть еще так называемые SAVE POINTS. Это примерно тоже самое что и транзакции, но их нельзя commit'ить, только откатывать до них. Используются они в первую очередь внутри триггеров или хранимых процедур.
Объявляются они командой SAVEPOINT, откат до них - ROLLBACK TO SAVEPOINT.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33296961
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JagerА вот можно ли попросить уважаемых метров написать что-то типа краткого FAQ по данному разделу (atomic-блоки, транзакции в W-SQL и T-SQL, их различие)?

Да нету там почти различий. Все по стандарту ANSI. А так - вон можно поискать по MSSQL, может у них это есть.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33297028
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверил на Oracle - тоже так как ASE,ASA: server не откатывает сам,
по видимому этот случай не входит в тот список который в ASE называется
Implicit Transaction Rollback Conditions и делается сервером итселф
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33297143
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да почему сервер вообще должен откатывать сам по приходу ошибочной команды????
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33297158
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jager

> BOL читаю, без этого, ясное дело, никуда, просто вопрос близко к теме
> получился...
> А вот можно ли попросить уважаемых метров написать что-то типа краткого
> FAQ по данному разделу (atomic-блоки, транзакции в W-SQL и T-SQL, их
> различие)? Как оказывается, это довольно интересная (особенно для
> начинающих) тема.


Это не FAQ, а RTFM. Продолжай читать BOL :)
Если туго с родным английским, есть кое-что перевеленное на русский. Это
в FAQ'е. А если уж появятся более конкретные вопросы - спрашивай здесь,
поможем.

White Owl
Просто commit/rollback завершит ближайшую транзакцию текущего уровня
вложенности.

Уверен в этом? Никто не застрахован от ошибок, ни ты, ни ASCRUS, ни я,
ни кто иной :) Всем нам полезно BOL перечитывать или проверять догадки
на практике.
COMMIT действительно завершит ближайшую транзакцию текущего уровня
вложенности. А вот ROLLBACK откатит ВСЮ ВЛОЖЕННУЮ матрешку транзакций:

begin tran
begin tran
begin tran
rollback
select @@trancount
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33297182
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГoлдунУверен в этом?
Да! Еще пол минуты назад я был в этом уверен :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33297308
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
PRINT @@TRANCOUNT

BEGIN TRAN
PRINT @@TRANCOUNT

INSERT INTO TestTran (id) VALUES ( 1 )

BEGIN TRAN Test
PRINT @@TRANCOUNT

INSERT INTO TestTran (id) VALUES ( 1 )

SELECT *
FROM TestTran

ROLLBACK

PRINT @@TRANCOUNT

SELECT *
FROM TestTran

COMMIT
Вот поэтому то я и говорю, что в ASA нет вложенных транзакций - есть их эмуляция для совместимости с ASE и MSSQL. Насчет стандартов - попробуйте в том же MSSQL без надобности написать COMMIT или ROLLBACK - сразу пошлет. И если рассматривать исключительно процедуры на WatcomSQL, то нет в там явного старта транзакций (то есть оператора BEGIN TRAN) и всегда AUTOCOMMIT=OFF, что тоже вроде бы как не до конца по стандарту.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299297
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSВот поэтому то я и говорю, что в ASA нет вложенных транзакций
Есть вложеные транзакции, есть. Просто завершение транзакции через commit закрывает только последнюю открытую транзакцию, а завершение через rollback отменяет все транзакции вплоть до самой первой. Даже если "внутренние" транзакции были завершены с commit они тоже будут отменены. Вот, я чуть-чуть модифицировал твой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
PRINT @@TRANCOUNT

BEGIN TRAN
PRINT @@TRANCOUNT

INSERT INTO TestTran (id) VALUES ( 1 )

BEGIN TRAN Test
PRINT @@TRANCOUNT

INSERT INTO TestTran (id) VALUES ( 1 )

COMMIT
PRINT @@TRANCOUNT

SELECT *
FROM TestTran

ROLLBACK

PRINT @@TRANCOUNT

SELECT *
FROM TestTran

COMMIT

ASCRUSИ если рассматривать исключительно процедуры на WatcomSQL, то нет в там явного старта транзакций (то есть оператора BEGIN TRAN) и всегда AUTOCOMMIT=OFF, что тоже вроде бы как не до конца по стандарту.
Я не понимаю, откуда ты это взял?! Вот открываем BOL, главу
ASA SQL Reference
SQL Statements
BEGIN TRANSACTION statement
Читаем... Много написано про совместимость и разницу в поведении этой команды на ASA и ASE, но я не вижу там ни одного упоминания про WatcomSQL или TransactSQL. При этом я в 99.9% случаев использую именно WatcomSQL и команда BEGIN TRAN[SACTION] ни разу меня не подводила. Я просто не могу понять, откуда ты взял что на WatcomSQL нету явного старта транзакций? И вообще, почему вдруг один из диалектов сервера вдруг перестал поддерживать возможность самого сервера???
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299334
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ok, вот эти ХП на WatcomSQL и TSQL попробуй скомпилить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE PROCEDURE TestTSQL
AS
BEGIN
  BEGIN TRANSACTION
  PRINT 'START'
  COMMIT
END

go

CREATE PROCEDURE TestWatcom ()
BEGIN
  BEGIN TRANSACTION;
  MESSAGE 'START' TO CLIENT;
  COMMIT;
END;

go
Мне почему то кажется странным, что на TSQL компилит, а на WatcomSQL выдает синтаксическую ошибку в строке 3 (BEGIN TRANSACTION). Что я не правильно делаю ?
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299408
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSМне почему то кажется странным, что на TSQL компилит, а на WatcomSQL выдает синтаксическую ошибку в строке 3 (BEGIN TRANSACTION). Что я не правильно делаю ?
Теперь уже я ничего не понимаю :) Облазил всю BOL, но таки нашел одно единственное упоминание в самом низу главы:
ASA SQL User's Guide
Using Transactions and Isolation Levels
Introduction to transactions
Using transactions
Adaptive Server Anywhere also supports Transact-SQL commands such as BEGIN TRANSACTION, for compatibility with Sybase Adaptive Server Enterprise. For further information, see Transact-SQL Compatibility.
Хорошо.... тогда возникает вопрос, как внутри процедуры на WatcomSQL можно сделать вложенные транзакции? ..... И вообще, зачем это может пригодиться? :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299473
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Хорошо.... тогда возникает вопрос, как внутри процедуры на WatcomSQL
> можно сделать вложенные транзакции? ..... И вообще, зачем это может
> пригодиться? :)

Вот второй вопрос гораздо интереснее. И при определенном ответе на него
первый сам исчезнет. У меня пока ни разу не возникло потребности во
вложенных транзакциях
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299503
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГoлдунВот второй вопрос гораздо интереснее. И при определенном ответе на него первый сам исчезнет. У меня пока ни разу не возникло потребности во вложенных транзакциях

Вообще один ответ я знаю :) Если у нас есть две таблицы связаные по ключу, теоретически сервер может не принимать запись в ведомую таблицу до тех пор пока запись в мастер-таблице не прошла через commit. Тогда вложеные транзакции могут быть удобны - начинаем две транзакции, делаем запись в мастер-таблицу, коммитим ее, делаем записи в ведомую таблицу. А теперь если есть нужда можем откатить как записи в ведомую, так и в мастер-таблицу.
Правда в ASA так извращаться не нужно :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299595
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ASE на самом деле все промежуточые commitы только уменьшают @@trancount (баланс скобок), реальный commit делает только тот который устанавливает его (@@trancount) в 0. Nested transactions имеют смысл во вложенных вызовах stored procedures (начинающих/продолжающих транзакцию), например один из способов обработки ошибки (по моим подсчетам их 3)описанный в "Sybase SQL Server 11 Unleashed" by Jeff Garbus и др., таков (комметарии мои):

create <procname>
...
begin tran [<tranname>] -- Added to avoid 6401,266 err.messages
save tran <savepoint> -- in case of regular ROLLBACK stmt
...
select @sqlerr = @@error
if @sqlerr != 0 goto syb_err
...
commit [<tranname>]
return @OK

syb_err:
rollback <savepoint> -- откат только для изменений данной sp
commit tran --empty commit for @@trancount decr.(otherwise 266 err)
raiserror <error number> @error_message,...,@syb_err
return @NOT_OK
end <procname>

Здесь 2-ой commit (fake) служит именно для баланса скобок (@@trancount)
без него мы получим ошибку 266 в вызывающей sp. (if we have begin tran over there too)

Другой способ состоит в проверке @@trancount на входе sp и если он > 0
(т.е. мы уже в транзакции) то не ставить begin tran, a при = 0 начать
новую поставив begin tran. типа:

create <procname>
...
select @sqlerr = 0
...
if @@trancount > 0 -- Already in transaction, nothing to do
select @TranOpened = 1
else
begin
select @TranOpened = 0
begin tran <tranname>
end
...
select @sqlerr = @@error
if @sqlerr != 0 goto syb_err
...
syb_err:
if @tranOpened = 0
begin
if @sqlerr = 0
commit [<tranname>] -- Реальный commit
else
rollback tran [<tranname>] -- Полный откат
end
return @sqlerr
end <procname>

Этот способ хорошо описан в книжке ".NET Enterprise Design with Visual Basic .NET and SQL Server 2000" by Jimmy Nilsson (ну правда на MSSQL)

Вообще это все (error handling) погано сделано в ASE и плохо описано
IMHO
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299624
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZhoraВ ASE на самом деле все промежуточые commitы только уменьшают @@trancount (баланс скобок), реальный commit делает только тот который устанавливает его (@@trancount) в 0.
Ну и в ASA тоже самое :)

Zhora
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create <procname>
...
begin tran [<tranname>]   -- Added to avoid 6401,266 err.messages 
save  tran <savepoint>     -- in case of regular ROLLBACK stmt
...
select @sqlerr = @@error
if @sqlerr !=  0  goto syb_err
...
commit [<tranname>]
return @OK

syb_err:
  rollback <savepoint> -- откат только для изменений данной sp
  commit tran             --empty commit for @@trancount decr.(otherwise 266 err)
  raiserror <error number> @error_message,...,@syb_err                                                
  return @NOT_OK
end <procname>

О! Теперь я понял почему в процедуре на WatcomSQL нельзя использовать BEGIN TRANSACTION. Чтобы вот такой фигни с повторением команд не было :) То же самое на WatcomSQL можно написать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create procedure aaaaaa
begin
    DECLARE myException EXCEPTION FOR SQLSTATE '?????';
    .....
    SAVEPOINT;
    .....

EXCEPTION
     WHEN myException THEN
          .......
          ROLLBACK TO SAVEPOINT;
          .......
     WHEN OTHERS THEN
          ROLLBACK TO SAVEPOINT;
          RESIGNAL ;
end;
В смысле одной пары SAVEPOINT/ROLLBACK TO SAVEPOINT хватает для полной эмуляции вложеных транзакций. Запрещаем начинать-завершать транзакции внутри процедур и триггеров - получаем невозможность неожиданного для клиента закрытия транзакции. Но так как внутри процедур тоже надо иногда откатывать - вводим "безопасные точки". И жизнь становится легкой и замечательной :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299626
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ Oчень детальное desc (хоть MSSQL, но почти все то же):
Error handling in SQL Server-a Backgroud
Implementing Error Handling with Stored Procedures
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33301518
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не хотелось бы ляпнуть глупость, но в ISQL есть опция - что-то типа коммитить каждое утверждение. Для проверки я бы её бы отключил и выполнил бы исходный тест.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Проблема с транзакциями в ASA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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