|
|
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
Господа, порой встречается подобный код: begin transaction update table commit transaction Интересно зачем создавать транзакцию для одного запроса. Я ради интереса пробовал симулировать ошибку, но разницы никакой не заметил между выполнение запроса в явно открытой транзакции или без неё. Зачем-же так пишут? Дань традиции? Стиль других СУБД? Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 23:29 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
Удалось разобраться, так что вопрос снимается. Транзакции для одного запроса имеют смысл в режиме chained mode, т.к. в нём если есть несколько запросов и какой-нибудь из них не сработает, то откатится всё. Если же каждый запрос поместить в отдельную явную транзакцию, то такого не произойдёт. В общем, в процедурах имеет смысл, что бы сделать их более устойчивыми к настройкам сессии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 00:38 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
Читай тут: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1502/html/sqlug/X20150.htm Особенно главы Nested transactions и Using transactions in stored procedures and triggers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 01:20 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
Kru wrote: > Я ради интереса пробовал симулировать ошибку, но разницы никакой не заметил > между выполнение запроса в явно открытой транзакции или без неё. Разницы нет. Зачем-же так пишут? Дань традиции? Стиль других СУБД? Например, генерируемый код. может быть с одним запросом, а может быть с несколькими. Или соглашения о кодировании. Надо добавить операторы -- добавил, и не думаешь о транзакции. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 01:59 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
Господа, большое спасибо за отклик. В теории оно вроде понятно, но как объяснить следующее?... создаём табличку, уникальный индекс и 2 процедуры, написанные так, чтобы 1й запрос прошёл и второй завершился ошибкой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. В isql сессии ставим set chained off и выполняем обе процедуры - результат одинаковый - 1я запись вставляется, вторая нет (в силу ошибки) открываем 2ю сессию и ставим set chained on выполняем 1ю процедуру (содержащую транзакции) - всё отрабатывает и транзакция автоматически коммитится (что довольно интересно и идёт вопреки с теорией вложенных транзакций) выполняем теперь процедуру без транзакций - мы видим, что она выдаёт сообщение Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRAN is missing. Previous count = 0, Current count = 1. Может багафича - не знаю, но процедура содержащая транзакции оказывается работоспособной в любом режиме, в то время как процедура без транзакций в chained mode уже не работает. Я создавал процедуры как в Артизане, так и в isql. На результат этот не повлияло. Может кто-нибудь повторить мой тест? Какие соображения почему так происходит? Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 18:58 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
Kruоткрываем 2ю сессию и ставим set chained on выполняем 1ю процедуру (содержащую транзакции) - всё отрабатывает и транзакция автоматически коммитится (что довольно интересно и идёт вопреки с теорией вложенных транзакций)Ничего не вопреки. В цепочном режиме главная транзакция открывается на первой же команде - в данном случае на вызове процедуры. Транзакции внутри процедуры уже являются вложенными. А commit принадлежащий вложенной транзакции всего-лишь уменьшает счетчик вложений и ничего не коммитит в реальности. Читай главу Nested Transactions еще раз, самый первый абзац :) Kruвыполняем теперь процедуру без транзакций - мы видим, что она выдаёт сообщение Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRAN is missing. Previous count = 0, Current count = 1.Это весьма странное и невнятное сообщение об ошибке означает что ASE обнаружила ошибку в данных внутри вложенной транзакции внутри хранимой процедуры и желает сделать rollback, но не может без явного соизволения юзера. Оно упоминается в главе Errors and transaction rollbacks . Ссылку на документацию я уже давал. KruМожет багафича - не знаю, но процедура содержащая транзакции оказывается работоспособной в любом режиме, в то время как процедура без транзакций в chained mode уже не работает.Все совсем наоборот. Процедура с транзакциями в цепочном режиме создает вложенные транзакции со всеми их недостатками. Зато в режиме принудительных транзакций такая процедура выполнится на половину и пользователь не сможет откатить ее целиком. Процедура без транзакций либо выполнится целиком, либо не выполнится целиком в любом режиме. Вывод: делать транзакции внутри хранимок глупо. KruЯ создавал процедуры как в Артизане, так и в isql. На результат этот не повлияло.Ну так а с чего бы это влияло на результат? Транзакции и их режимы это внутреннее дело сервера. От смены клиента сервер не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 19:34 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
Большое спасибо за отклик. Позволю себе не согласиться. White OwlНичего не вопреки. В цепочном режиме главная транзакция открывается на первой же команде - в данном случае на вызове процедуры. Транзакции внутри процедуры уже являются вложенными. А commit принадлежащий вложенной транзакции всего-лишь уменьшает счетчик вложений и ничего не коммитит в реальности. Читай главу Nested Transactions еще раз, самый первый абзац :) Читал. Вот фрагмент из определения вложенных транзакций авторYou can nest transactions within other transactions. When you nest begin transaction and commit transaction statements, the outermost pair actually begin and commit the transaction. The inner pairs just keep track of the nesting level. Adaptive Server does not commit the transaction until the commit transaction that matches the outermost begin transaction is issued Но процедура ведёт себя именно вопреки! В цепном режиме - вызываем процедуру - открывается транзакция - далее всё что выполняется внутри транзакций в процедуре, даже если и коммитится, то должно только влиять на счётчик и само завершение процедуры не должно завершать транзакцию. Так ведь ? (согласно доке) Открытая цепным режимом транзакция должна будет ждать своего завершения, но именно этого и не просиходит когда в процедуре используются транзакции * (см несколько комментариев ниже) То что происходит - это каким-то образом закрывается и внешняя транзакция, при этом всегда с коммитом. Это поведение -то и противоричит тому что в доке написано. Не верится - попробуйте сами. * Очень важно, чтобы всё было в транзакциях даже селекты. Если например попытаться вывести результат счётчика транзакций простым селектом, без помещения его в транзакции, то внешняя транзакция автоматически закоммичена не будет. Насчёт того, почему написал, что пробовал создавать процедуру не только в Артизане, но и в коммандной строке - ну это для чистоты экперимента , чтобы убедиться, что Артизан от себя чего-нибудь не добавил. По поводу глупости использования транзакций в процедурах - я бы небыл столь категориченым. Разные бывают решения, но конечно код со вложенными транзакциями сложнее поддерживать. Зачем это нужно - ну вот пример в данном топике показывает что процедура с транзакциями ведёт себя в цепном режиме по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2010, 00:18 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
Kru wrote: Ребята, процедуры никак транзакциями не управляют. Максимум что может быть это в chained mode при вызове процедуры неявно начнётся транзакция. Всё. Коммитить её в любом случае надо руками. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2010, 13:24 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
MasterZiv Kru wrote: Ребята, процедуры никак транзакциями не управляют. Максимум что может быть это в chained mode при вызове процедуры неявно начнётся транзакция. Всё. Коммитить её в любом случае надо руками. Так в этом то и весь вопрос - что коммитить, по идее, нужно всегда ручками, но сервер тем не менне автоматически коммитит, если все транзакции в процедуре созданы явно. Т.е. он делает исключение - что странно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2010, 17:33 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
KruВ цепном режиме - вызываем процедуру - открывается транзакция - далее всё что выполняется внутри транзакций в процедуре, даже если и коммитится, то должно только влиять на счётчик и само завершение процедуры не должно завершать транзакцию. Так ведь ? (согласно доке)Так. Используя твои процедуры в цепочном режиме, делаем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. KruПо поводу глупости использования транзакций в процедурах - я бы небыл столь категориченым.А я буду. Не знаю ни одной задачи которая требовала бы вложенных транзакций. Максимум что может быть полезным это точки сохранения, но и они на практике мне ни разу не пригодились. KruЗачем это нужно - ну вот пример в данном топике показывает что процедура с транзакциями ведёт себя в цепном режиме по другому.Ну это прямо как по анекдоту: - Доктор у меня вот здесь болит если туда стукнуть - А вы туда не стукайте. Конечно процедура с транзакциями ведет себя по разному в разных режимах. Поэтому никто в здравом уме и твердой памяти не будет делать транзакции внутри процедур. То что их можно делать, не означает что их нужно делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2010, 18:07 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
White Owl wrote: > Конечно процедура с транзакциями ведет себя по разному в разных режимах. > Поэтому никто в здравом уме и твердой памяти не будет делать транзакции > внутри процедур. То что их можно делать, не означает что их нужно делать. Мы делали всегда, делаем, и будем делать, никто нас в сумашедшие ещё не записывал. Всё работает великолепно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2010, 19:53 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
MasterZiv White Owl wrote: > Конечно процедура с транзакциями ведет себя по разному в разных режимах. > Поэтому никто в здравом уме и твердой памяти не будет делать транзакции > внутри процедур. То что их можно делать, не означает что их нужно делать. Мы делали всегда, делаем, и будем делать, никто нас в сумашедшие ещё не записывал. Я вас записываю. MasterZivВсё работает великолепно.Ну я так понимаю что откатывать процедуры у вас тоже нужда не возникала. И вообще все клиенты работают в режиме автокоммита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2010, 20:25 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
White Owl Используя твои процедуры в цепочном режиме, делаем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Не совсем. Попробуйте сделать 2 процедуры - в обеих Insert в какую-нибудь dummy табличку, но только в 1й процедуре этот insert вложите в явную транзакцию. Попробуйте выполнить их в chain mode. Расскажите, была ли разница? По идее 1я процедура должна завершиться автокоммитом, в то время как 2я (без явной транзакции), завершится сообщением о висячей транзакции. Если удастся это воспроизвести, то станет сразу ясно, о чём речь идёт. С чего это вдруг, 1й случай автокоммитится, а второй нет? Если на клиенте автокоммит не установлен, то незакрытая транзакция должна оставаться незакрытой в обоих случаях, ну а если установлен, то должна в обоих случаях коммитится. Так ведь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2010, 23:06 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
White Owl wrote: > Я вас записываю. Спасибочки > Ну я так понимаю что откатывать процедуры у вас тоже нужда не возникала. Возникала, откатываем. > И вообще все клиенты работают в режиме автокоммита. Да, и НЕ управляют транзакциями. Но вот сейчас третье звено добавляем, будут работать и так, и так. И в chained, и в автокомите. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2010, 23:36 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
MasterZiv White Owl wrote: > Я вас записываю. Спасибочки > Ну я так понимаю что откатывать процедуры у вас тоже нужда не возникала. Возникала, откатываем. > И вообще все клиенты работают в режиме автокоммита. Да, и НЕ управляют транзакциями. Но вот сейчас третье звено добавляем, будут работать и так, и так. И в chained, и в автокомите. Так кто-нибудь попробовал воспроизвести странное поведение Sybase? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2010, 00:50 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
KruТак кто-нибудь попробовал воспроизвести странное поведение Sybase?Ну попробовал, я попробовал. И нет, я не получил ошибки о продолжающихся транзакциях. Я получил правильную ошибку о совпадении ключей. Используя твои процедуры делаю на ASE 15.0.3#2 (извините, старее нету) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Повторяю тоже самое с выключенным цепочным режимом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Никаких автокоммитов в цепочном режиме нету и быть не может. Только ручной с клиента. В этом собственно говоря и есть главная разница между цепочным и нецепочным режимом. В одном первый вызов begin transaction начинает вложенную транзакцию, а во втором заменяет собой автоматическую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2010, 01:07 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
White Owl, Большое спасибо что попробовал (давайте на ты) На пятнашке всё правильно работает, но поверь, на 12.5.4 происходит именно автокоммит. В нашей компании ещё один программист это подтвердил и багафичу админам на исследование отправили, т.к. пока сидим на 12.5.ххх Для меня вопрос закрыт. Ещё раз тебе и Мастеру огромное спасибо за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2010, 17:03 |
|
||
|
ASE 12.5.4 - транзакция для одного запроса
|
|||
|---|---|---|---|
|
#18+
KruWhite Owl, Большое спасибо что попробовал (давайте на ты)Давно пора. KruНа пятнашке всё правильно работает, но поверь, на 12.5.4 происходит именно автокоммит. В нашей компании ещё один программист это подтвердил и багафичу админам на исследование отправили, т.к. пока сидим на 12.5.хххТо есть в показном мной скрипте во включеном цепочном режиме после rollback остается одна запись? В цепочном режиме записей после отката быть не должно. А в не-цепочном после отката должна остаться одна запись. Если это не так, то действительно баг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2010, 20:45 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=36483589&tid=2010726]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 365ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...