Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Проблема с транзакциями в ASA / 25 сообщений из 36, страница 1 из 2
29.09.2005, 00:34
    #33294571
th0rn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
Приветствую всех.

Начал изучать 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
29.09.2005, 00:47
    #33294574
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
А почему транзакция должна откатываться?
Если во время транзакции пришла ошибочная команда это не повод отменить всю транзакцию.
Хочешь отменить транзакцию - давай команду rollback.
...
Рейтинг: 0 / 0
29.09.2005, 00:52
    #33294576
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
А то что ты хочешь сделать делается командой
Код: plaintext
1.
2.
3.
4.
5.
6.
begin atomic
   insert .....;
   insert .....;
   insert .....;
   insert .....;
   insert .....;
end;
Вот тогда ошибка внутри блока отменит все что происходило в блоке до нее.
...
Рейтинг: 0 / 0
29.09.2005, 00:56
    #33294578
th0rn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
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
29.09.2005, 01:05
    #33294585
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
Ну, все правильно. Просто транзакцию надо завершать, либо commit'ом, либо
rollback'ом. А до момента вызова одного из них, данные в таблице будут
по-любому. Клиент должен проверять код ошибки, и если сервер ругнулся на
что-то и Вам нужна атомарность(а она ведь может и не нужна в этом месте,
зависит от задачи), то тогда вызвать rollback, иначе commit.


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


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

Кстати, сейчас запустил ASE - такое же поведение. (А begin atomic там вроде нет).
...
Рейтинг: 0 / 0
29.09.2005, 09:30
    #33294791
Jager
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
Может немного и не в тему, но также вопрос по транзакциям...
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
29.09.2005, 10:09
    #33294875
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
Ну во первых не 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
29.09.2005, 10:26
    #33294932
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
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
29.09.2005, 10:34
    #33294961
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
th0rn
А как же принцип атомичности - выполняются все команды или ни одна команда?
Если не выполнилась хотя бы одна - не должны сохраниться изменения ни от тех, что были до (в транзакции), ни от тех, что после... Или нет?


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

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

Выборка (чтение) данных - тоже транзакция, все правильно, надо стартовать транзакцию. Это и соответствует ANSI, и логично -- ты же можешь на основе этих данных потом делать UPDATE/DELETE/INSERT.
То есть в TSQL если явно не стартовать транзакцию, то SELECT на высоком уровне изоляции поставит блокировки только на время выполнения SELECT-а, а потом их снимет ? В WatcomSQL немножко проще, там нет явного старта транзакций, поэтому SELECT повесит блокировки до явного COMMIT или ROLLBACK, вне зависимости от того, были дальше DML операторы или нет. Кстати в ASA нет понятия вложенных транзакций, есть SAVEPOINT и атомарные блоки (фактически это те же самые SAVEPOINT, только организующиеся автоматом для атомарных блоков). Зато никто не ругается, если сделать лишний разок на всякий случай COMMIT или ROLLBACK, даже если и не было старта транзакции.
...
Рейтинг: 0 / 0
29.09.2005, 11:07
    #33295069
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
ASCRUS
То есть в TSQL если явно не стартовать транзакцию, то SELECT на высоком уровне изоляции поставит блокировки только на время выполнения SELECT-а, а потом их снимет ?
При чем здесь TSQL или Watcom? Это стандарт SQL, ANSI. Всё это поведение описывается им, в обоих случаях AUTOCOMMIT .
Если интересуют именно подробности работы ASE -- так там практически то же самое, что ты написал.
...
Рейтинг: 0 / 0
29.09.2005, 11:15
    #33295091
Jager
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
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
29.09.2005, 11:29
    #33295152
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
Давайте чуть позже. Мы доделываем сайт RU-SUG, уже форум приличный прикрутили и как начнем перенос материалов, заодно будем и новые материалы выкладывать параллейно для RU-SUG, FAQ SQL.RU и рассылке по ASA. Кстати это еще придется с Judge обсуждать, как лучше интегрировать портал пользователей Sybase с SQL.RU, чтобы мы были партнерскими, а не конкурирующими сайтами и что делать с форумами - судя по последним переговорам с Judge обьединить их вряд ли удасться, а у нас форумы однозначно круче и удобнее для пользователей и модераторов. Плюс будут форумы по каждому продукту в отдельности, однако не хотелось бы разрывать SQL.RU с порталом, будем думать :)
...
Рейтинг: 0 / 0
29.09.2005, 18:07
    #33296761
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
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
29.09.2005, 18:30
    #33296828
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
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
29.09.2005, 19:39
    #33296961
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
JagerА вот можно ли попросить уважаемых метров написать что-то типа краткого FAQ по данному разделу (atomic-блоки, транзакции в W-SQL и T-SQL, их различие)?

Да нету там почти различий. Все по стандарту ANSI. А так - вон можно поискать по MSSQL, может у них это есть.
...
Рейтинг: 0 / 0
29.09.2005, 20:17
    #33297028
Zhora
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
проверил на Oracle - тоже так как ASE,ASA: server не откатывает сам,
по видимому этот случай не входит в тот список который в ASE называется
Implicit Transaction Rollback Conditions и делается сервером итселф
...
Рейтинг: 0 / 0
29.09.2005, 22:24
    #33297143
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
Да почему сервер вообще должен откатывать сам по приходу ошибочной команды????
...
Рейтинг: 0 / 0
29.09.2005, 22:45
    #33297158
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями в ASA
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
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Проблема с транзакциями в ASA / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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