Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблема с транзакциями в 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?fid=55&msg=33299626&tid=2013354]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 255ms |
| total: | 399ms |

| 0 / 0 |
