powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Проблема с транзакциями в ASA
11 сообщений из 36, страница 2 из 2
Проблема с транзакциями в ASA
    #33297182
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГoлдунУверен в этом?
Да! Еще пол минуты назад я был в этом уверен :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33297308
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
PRINT @@TRANCOUNT

BEGIN TRAN
PRINT @@TRANCOUNT

INSERT INTO TestTran (id) VALUES ( 1 )

BEGIN TRAN Test
PRINT @@TRANCOUNT

INSERT INTO TestTran (id) VALUES ( 1 )

SELECT *
FROM TestTran

ROLLBACK

PRINT @@TRANCOUNT

SELECT *
FROM TestTran

COMMIT
Вот поэтому то я и говорю, что в ASA нет вложенных транзакций - есть их эмуляция для совместимости с ASE и MSSQL. Насчет стандартов - попробуйте в том же MSSQL без надобности написать COMMIT или ROLLBACK - сразу пошлет. И если рассматривать исключительно процедуры на WatcomSQL, то нет в там явного старта транзакций (то есть оператора BEGIN TRAN) и всегда AUTOCOMMIT=OFF, что тоже вроде бы как не до конца по стандарту.
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299297
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
PRINT @@TRANCOUNT

BEGIN TRAN
PRINT @@TRANCOUNT

INSERT INTO TestTran (id) VALUES ( 1 )

BEGIN TRAN Test
PRINT @@TRANCOUNT

INSERT INTO TestTran (id) VALUES ( 1 )

COMMIT
PRINT @@TRANCOUNT

SELECT *
FROM TestTran

ROLLBACK

PRINT @@TRANCOUNT

SELECT *
FROM TestTran

COMMIT

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 нету явного старта транзакций? И вообще, почему вдруг один из диалектов сервера вдруг перестал поддерживать возможность самого сервера???
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299334
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ok, вот эти ХП на WatcomSQL и TSQL попробуй скомпилить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE PROCEDURE TestTSQL
AS
BEGIN
  BEGIN TRANSACTION
  PRINT 'START'
  COMMIT
END

go

CREATE PROCEDURE TestWatcom ()
BEGIN
  BEGIN TRANSACTION;
  MESSAGE 'START' TO CLIENT;
  COMMIT;
END;

go
Мне почему то кажется странным, что на TSQL компилит, а на WatcomSQL выдает синтаксическую ошибку в строке 3 (BEGIN TRANSACTION). Что я не правильно делаю ?
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299408
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 можно сделать вложенные транзакции? ..... И вообще, зачем это может пригодиться? :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299473
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Хорошо.... тогда возникает вопрос, как внутри процедуры на WatcomSQL
> можно сделать вложенные транзакции? ..... И вообще, зачем это может
> пригодиться? :)

Вот второй вопрос гораздо интереснее. И при определенном ответе на него
первый сам исчезнет. У меня пока ни разу не возникло потребности во
вложенных транзакциях
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299503
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГoлдунВот второй вопрос гораздо интереснее. И при определенном ответе на него первый сам исчезнет. У меня пока ни разу не возникло потребности во вложенных транзакциях

Вообще один ответ я знаю :) Если у нас есть две таблицы связаные по ключу, теоретически сервер может не принимать запись в ведомую таблицу до тех пор пока запись в мастер-таблице не прошла через commit. Тогда вложеные транзакции могут быть удобны - начинаем две транзакции, делаем запись в мастер-таблицу, коммитим ее, делаем записи в ведомую таблицу. А теперь если есть нужда можем откатить как записи в ведомую, так и в мастер-таблицу.
Правда в ASA так извращаться не нужно :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299595
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 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
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299624
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
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>

О! Теперь я понял почему в процедуре на WatcomSQL нельзя использовать BEGIN TRANSACTION. Чтобы вот такой фигни с повторением команд не было :) То же самое на WatcomSQL можно написать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create procedure aaaaaa
begin
    DECLARE myException EXCEPTION FOR SQLSTATE '?????';
    .....
    SAVEPOINT;
    .....

EXCEPTION
     WHEN myException THEN
          .......
          ROLLBACK TO SAVEPOINT;
          .......
     WHEN OTHERS THEN
          ROLLBACK TO SAVEPOINT;
          RESIGNAL ;
end;
В смысле одной пары SAVEPOINT/ROLLBACK TO SAVEPOINT хватает для полной эмуляции вложеных транзакций. Запрещаем начинать-завершать транзакции внутри процедур и триггеров - получаем невозможность неожиданного для клиента закрытия транзакции. Но так как внутри процедур тоже надо иногда откатывать - вводим "безопасные точки". И жизнь становится легкой и замечательной :)
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33299626
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ Oчень детальное desc (хоть MSSQL, но почти все то же):
Error handling in SQL Server-a Backgroud
Implementing Error Handling with Stored Procedures
...
Рейтинг: 0 / 0
Проблема с транзакциями в ASA
    #33301518
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не хотелось бы ляпнуть глупость, но в ISQL есть опция - что-то типа коммитить каждое утверждение. Для проверки я бы её бы отключил и выполнил бы исходный тест.
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Проблема с транзакциями в ASA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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