Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Александр ГoлдунУверен в этом? Да! Еще пол минуты назад я был в этом уверен :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 23:15 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 06:26 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
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. 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 нету явного старта транзакций? И вообще, почему вдруг один из диалектов сервера вдруг перестал поддерживать возможность самого сервера??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 18:01 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Ok, вот эти ХП на WatcomSQL и TSQL попробуй скомпилить: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 18:19 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
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 можно сделать вложенные транзакции? ..... И вообще, зачем это может пригодиться? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 19:11 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Хорошо.... тогда возникает вопрос, как внутри процедуры на WatcomSQL > можно сделать вложенные транзакции? ..... И вообще, зачем это может > пригодиться? :) Вот второй вопрос гораздо интереснее. И при определенном ответе на него первый сам исчезнет. У меня пока ни разу не возникло потребности во вложенных транзакциях Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 20:17 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
Александр ГoлдунВот второй вопрос гораздо интереснее. И при определенном ответе на него первый сам исчезнет. У меня пока ни разу не возникло потребности во вложенных транзакциях Вообще один ответ я знаю :) Если у нас есть две таблицы связаные по ключу, теоретически сервер может не принимать запись в ведомую таблицу до тех пор пока запись в мастер-таблице не прошла через commit. Тогда вложеные транзакции могут быть удобны - начинаем две транзакции, делаем запись в мастер-таблицу, коммитим ее, делаем записи в ведомую таблицу. А теперь если есть нужда можем откатить как записи в ведомую, так и в мастер-таблицу. Правда в ASA так извращаться не нужно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 21:07 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
В 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 23:40 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
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. О! Теперь я понял почему в процедуре на WatcomSQL нельзя использовать BEGIN TRANSACTION. Чтобы вот такой фигни с повторением команд не было :) То же самое на WatcomSQL можно написать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2005, 00:26 |
|
||
|
Проблема с транзакциями в ASA
|
|||
|---|---|---|---|
|
#18+
+ Oчень детальное desc (хоть MSSQL, но почти все то же): Error handling in SQL Server-a Backgroud Implementing Error Handling with Stored Procedures ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2005, 00:28 |
|
||
|
|

start [/forum/topic.php?all=1&fid=55&tid=2013354]: |
0ms |
get settings: |
10ms |
get forum list: |
23ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
66ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
95ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 458ms |

| 0 / 0 |
