Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Начал изучать ASA (нравится все больше и больше, кстати) и столкнулся с крайне странной проблемой. Пусть имеется таблица (пустая): Код: plaintext 1. Теперь вставляем записи внутри транзакции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. На третьем insert'e возникает ошибка primary key not unique, как и должно быть. Но первые 2 записи остаются в таблице, т.е. транзакция не откатывается! Еще интереснее, что если вводить все это в текстовом режиме (dbisql -nogui), то вставляются и записи после ошибки. Для сравнения, на том же PostgreSQL все работает как надо (после отката транзакции по ошибке таблица пустая). 'Begin просто' вместо 'begin tran' не пишу. Пробовал и ; и go и без оных. Про опцию Auto_commit в dbisql читал, она выключена. Пробовал и своей программкой через JDBC с conn.setAutoCommit(false) - та же фигня (нет только той записи, где повторяется ключ). В документации про это как-то невнятно. Так что sos :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 00:34 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
А почему транзакция должна откатываться? Если во время транзакции пришла ошибочная команда это не повод отменить всю транзакцию. Хочешь отменить транзакцию - давай команду rollback. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 00:47 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
А то что ты хочешь сделать делается командой Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 00:52 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
White OwlА почему транзакция должна откатываться? Если во время транзакции пришла ошибочная команда это не повод отменить всю транзакцию. Хочешь отменить транзакцию - давай команду rollback. А как же принцип атомичности - выполняются все команды или ни одна команда? Если не выполнилась хотя бы одна - не должны сохраниться изменения ни от тех, что были до (в транзакции), ни от тех, что после... Или нет? Вот и из документации: You can group SQL statements into transactions, which have the property that either all statements are executed or none is executed. дока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 00:56 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Ну, все правильно. Просто транзакцию надо завершать, либо commit'ом, либо rollback'ом. А до момента вызова одного из них, данные в таблице будут по-любому. Клиент должен проверять код ошибки, и если сервер ругнулся на что-то и Вам нужна атомарность(а она ведь может и не нужна в этом месте, зависит от задачи), то тогда вызвать rollback, иначе commit. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 01:05 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
iLLer Ну, все правильно. Просто транзакцию надо завершать, либо commit'ом, либо rollback'ом. А до момента вызова одного из них, данные в таблице будут по-любому. Клиент должен проверять код ошибки, и если сервер ругнулся на что-то и Вам нужна атомарность(а она ведь может и не нужна в этом месте, зависит от задачи), то тогда вызвать rollback, иначе commit. Данные остаются именно после commit :) А проверка ошибок не всегда возможна - что если у меня просто script.sql с кучей insert'ов, которые должны либо залиться, либо не залиться, иначе будет винегрет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 01:11 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
White OwlА то что ты хочешь сделать делается командой Код: plaintext 1. 2. 3. 4. 5. 6. 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 Т. е. нет принципиальной разницы, и почему транзакция не работает - непонятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 01:17 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
th0rnТ. е. нет принципиальной разницы, и почему транзакция не работает - непонятно... Вот как раз принципиальная разница и есть. Ты путаешь транзакцию и атомарные блоки. В ASA это две разные вещи. Транзакция это блок команд, который начинается явной или неявной командой begin tran и заканчивается командами commit или rollback . Атомарный блок - блок команд начинающийся командой begin atomic и заканчивающийся командой end . Ошибка внутри транзакции не делает автоматического отката на начало транзакции. Ошибка внутри атомарного блока делает откат на начало блока. Как это сделано в других серверах в данное время совершенно не важно. В ASA это именно так. Есть begin tran, есть begin atomic. Что в данный момент нужно, то и используешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 01:33 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
th0rnДанные остаются именно после commit :) А проверка ошибок не всегда возможна - что если у меня просто script.sql с кучей insert'ов, которые должны либо залиться, либо не залиться, иначе будет винегрет? В начало скрипта ставишь begin atomic, в конец end; и наслаждаешься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 01:34 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
White Owl В начало скрипта ставишь begin atomic, в конец end; и наслаждаешься. Cпасибо, буду пользоваться. Кстати, сейчас запустил ASE - такое же поведение. (А begin atomic там вроде нет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 01:49 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Может немного и не в тему, но также вопрос по транзакциям... Sybase ASa v9.0.2.3137 Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext Sybase ASAСинтаксическая ошибка около 'tran' подсоединено 13 SQLCODE: -131 SQLSTATE: 42000 Если это возможно, просьба объяснить, не отсылая в BOL. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 09:30 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Ну во первых не START TRAN, а BEGIN TRAN. Во вторых стоит помнить, что BEGIN TRAN относиться к ХП на TSQL. Если процедура компилируется как WatcomSQL, то у него нет оператора BEGIN TRAN и считается, что любой DML оператор или SavePoint неявно стартует транзакцию (фактически, как для TSQL включить опцию CHAINED=ON). Кстати я не совсем понимаю, зачем на SELECT стартовать транзакцию, даже если и ХП переписать на TSQL - какой в этом смысл ? И еще замечание по коду: Код: plaintext P.S. Ну и напоследок - если проект не будет совместимым с MSSQL или ASE, то рекомендую вообще TSQL не пользоваться и писать все исключительно на WatcomSQL. Больше возможностей, меньше путаницы в диалектах. И все таки почитать BOL, как бы Вы не хотели, чтобы Вас туда не отсылали ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 10:09 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
th0rn Теперь вставляем записи внутри транзакции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. На третьем insert'e возникает ошибка primary key not unique, как и должно быть. Но первые 2 записи остаются в таблице, т.е. транзакция не откатывается! Правильно, и не должна. С какого фига вся транзакция должна откатываться ? Ты можешь проверить вставилась ли очередная запись и откатить все, если тебе нужно. А зачем еще ручное управление транзакциями нужно ? Но кстати интересно что на этот счет в стандарте SQL прописано -- надо посмотреть. Это к тому, что один кто-то из двух (ASA или PosgreSQL) работают не по стандарту. (на самом деле кстати ASE и MSSQL работают так же как ASA.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 10:26 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
th0rn А как же принцип атомичности - выполняются все команды или ни одна команда? Если не выполнилась хотя бы одна - не должны сохраниться изменения ни от тех, что были до (в транзакции), ни от тех, что после... Или нет? Чувствуется, что ты начитался стандартных (в смысле - "из стандарта" SQL) "умных" слов и вот теперь ... Это -- всего лишь теория, лишь определение транзакции, а на практике все зависит от реализации конкретного сервера БД. В большинстве серверов, кстати, ты можешь путем ручного управления транзакциями даже как бы нарушить ее атомарность - закоммитить например только часть изменений транзакции, а другую часть отменить. Пример простой -- берешь напр. пишешь триггер на вставку, и удаляешь в нем каждую вторую вставленную запись. Тут просто надо "атомарность" понимать в том смысле, что это атомарность , нужная приложению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 10:34 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
ASCRUS Кстати я не совсем понимаю, зачем на SELECT стартовать транзакцию, даже если и ХП переписать на TSQL - какой в этом смысл ? Выборка (чтение) данных - тоже транзакция, все правильно, надо стартовать транзакцию. Это и соответствует ANSI, и логично -- ты же можешь на основе этих данных потом делать UPDATE/DELETE/INSERT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 10:39 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
MasterZiv ASCRUS Кстати я не совсем понимаю, зачем на SELECT стартовать транзакцию, даже если и ХП переписать на TSQL - какой в этом смысл ? Выборка (чтение) данных - тоже транзакция, все правильно, надо стартовать транзакцию. Это и соответствует ANSI, и логично -- ты же можешь на основе этих данных потом делать UPDATE/DELETE/INSERT. То есть в TSQL если явно не стартовать транзакцию, то SELECT на высоком уровне изоляции поставит блокировки только на время выполнения SELECT-а, а потом их снимет ? В WatcomSQL немножко проще, там нет явного старта транзакций, поэтому SELECT повесит блокировки до явного COMMIT или ROLLBACK, вне зависимости от того, были дальше DML операторы или нет. Кстати в ASA нет понятия вложенных транзакций, есть SAVEPOINT и атомарные блоки (фактически это те же самые SAVEPOINT, только организующиеся автоматом для атомарных блоков). Зато никто не ругается, если сделать лишний разок на всякий случай COMMIT или ROLLBACK, даже если и не было старта транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 10:52 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
ASCRUS То есть в TSQL если явно не стартовать транзакцию, то SELECT на высоком уровне изоляции поставит блокировки только на время выполнения SELECT-а, а потом их снимет ? При чем здесь TSQL или Watcom? Это стандарт SQL, ANSI. Всё это поведение описывается им, в обоих случаях AUTOCOMMIT . Если интересуют именно подробности работы ASE -- так там практически то же самое, что ты написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 11:07 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
ASCRUSНу во первых не START TRAN, а BEGIN TRAN. Во вторых стоит помнить, что BEGIN TRAN относиться к ХП на TSQL. Если процедура компилируется как WatcomSQL, то у него нет оператора BEGIN TRAN и считается, что любой DML оператор или SavePoint неявно стартует транзакцию (фактически, как для TSQL включить опцию CHAINED=ON)... BOL читаю, без этого, ясное дело, никуда, просто вопрос близко к теме получился... А вот можно ли попросить уважаемых метров написать что-то типа краткого FAQ по данному разделу (atomic-блоки, транзакции в W-SQL и T-SQL, их различие)? Как оказывается, это довольно интересная (особенно для начинающих) тема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 11:15 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Давайте чуть позже. Мы доделываем сайт RU-SUG, уже форум приличный прикрутили и как начнем перенос материалов, заодно будем и новые материалы выкладывать параллейно для RU-SUG, FAQ SQL.RU и рассылке по ASA. Кстати это еще придется с Judge обсуждать, как лучше интегрировать портал пользователей Sybase с SQL.RU, чтобы мы были партнерскими, а не конкурирующими сайтами и что делать с форумами - судя по последним переговорам с Judge обьединить их вряд ли удасться, а у нас форумы однозначно круче и удобнее для пользователей и модераторов. Плюс будут форумы по каждому продукту в отдельности, однако не хотелось бы разрывать SQL.RU с порталом, будем думать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 11:29 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 18:07 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
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. Кроме этого в ASA есть еще так называемые SAVE POINTS. Это примерно тоже самое что и транзакции, но их нельзя commit'ить, только откатывать до них. Используются они в первую очередь внутри триггеров или хранимых процедур. Объявляются они командой SAVEPOINT, откат до них - ROLLBACK TO SAVEPOINT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 18:30 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
JagerА вот можно ли попросить уважаемых метров написать что-то типа краткого FAQ по данному разделу (atomic-блоки, транзакции в W-SQL и T-SQL, их различие)? Да нету там почти различий. Все по стандарту ANSI. А так - вон можно поискать по MSSQL, может у них это есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 19:39 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
проверил на Oracle - тоже так как ASE,ASA: server не откатывает сам, по видимому этот случай не входит в тот список который в ASE называется Implicit Transaction Rollback Conditions и делается сервером итселф ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 20:17 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Да почему сервер вообще должен откатывать сам по приходу ошибочной команды???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 22:24 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 22:45 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=33295069&tid=2013354]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 368ms |

| 0 / 0 |
