powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5.4 - транзакция для одного запроса
19 сообщений из 19, страница 1 из 1
ASE 12.5.4 - транзакция для одного запроса
    #36478858
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа,
порой встречается подобный код:

begin transaction
update table
commit transaction

Интересно зачем создавать транзакцию для одного запроса.

Я ради интереса пробовал симулировать ошибку, но разницы никакой не заметил
между выполнение запроса в явно открытой транзакции или без неё.

Зачем-же так пишут? Дань традиции? Стиль других СУБД?

Заранее спасибо
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36478916
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалось разобраться, так что вопрос снимается.

Транзакции для одного запроса имеют смысл в режиме chained mode, т.к.
в нём если есть несколько запросов и какой-нибудь из них не сработает, то откатится всё.
Если же каждый запрос поместить в отдельную явную транзакцию, то такого не произойдёт.

В общем, в процедурах имеет смысл, что бы сделать их более устойчивыми к настройкам сессии.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36478958
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читай тут:
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
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36478983
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru wrote:
> Я ради интереса пробовал симулировать ошибку, но разницы никакой не заметил
> между выполнение запроса в явно открытой транзакции или без неё.

Разницы нет.

Зачем-же так пишут? Дань традиции? Стиль других СУБД?

Например, генерируемый код. может быть с одним запросом,
а может быть с несколькими.
Или соглашения о кодировании. Надо добавить операторы --
добавил, и не думаешь о транзакции.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36480700
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, большое спасибо за отклик.
В теории оно вроде понятно, но как объяснить следующее?...


создаём табличку, уникальный индекс и 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.
create table test (i int, j int)
go
create unique nonclustered index idx_test on test (i)
go
create procedure test_tr
as
begin tran
insert into test values ( 1 , 1 )
commit
begin tran
insert into test values ( 1 , 2 )
commit
go

create procedure test_no_tr
as
insert into test values ( 1 , 1 )
insert into test values ( 1 , 2 )
go
EXEC sp_procxmode 'dbo.test_no_tr','anymode'
EXEC sp_procxmode 'dbo.test_tr','anymode'


В 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. На результат этот не повлияло.

Может кто-нибудь повторить мой тест?
Какие соображения почему так происходит?

Заранее спасибо
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36480743
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. На результат этот не повлияло.Ну так а с чего бы это влияло на результат? Транзакции и их режимы это внутреннее дело сервера. От смены клиента сервер не меняется.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36481034
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за отклик.
Позволю себе не согласиться.
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

Но процедура ведёт себя именно вопреки!

В цепном режиме - вызываем процедуру - открывается транзакция - далее всё что выполняется внутри транзакций в процедуре, даже если и коммитится, то должно только влиять на счётчик и само завершение процедуры не должно завершать транзакцию.
Так ведь ? (согласно доке)

Открытая цепным режимом транзакция должна будет ждать своего завершения, но именно этого и не просиходит когда в процедуре используются транзакции * (см несколько комментариев ниже)

То что происходит - это каким-то образом закрывается и внешняя транзакция, при этом всегда с коммитом.

Это поведение -то и противоричит тому что в доке написано.

Не верится - попробуйте сами.

* Очень важно, чтобы всё было в транзакциях даже селекты.
Если например попытаться вывести результат счётчика транзакций простым селектом, без помещения его в транзакции, то внешняя транзакция автоматически закоммичена не будет.

Насчёт того, почему написал, что пробовал создавать процедуру не только в Артизане, но и в коммандной строке - ну это для чистоты экперимента , чтобы убедиться, что Артизан от себя чего-нибудь не добавил.


По поводу глупости использования транзакций в процедурах - я бы небыл столь категориченым.

Разные бывают решения, но конечно код со вложенными транзакциями сложнее поддерживать.

Зачем это нужно - ну вот пример в данном топике показывает что процедура с транзакциями ведёт себя в цепном режиме по другому.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36481972
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru wrote:

Ребята, процедуры никак транзакциями не управляют.
Максимум что может быть это в chained mode при вызове
процедуры неявно начнётся транзакция.
Всё. Коммитить её в любом случае надо руками.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36483263
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Kru wrote:

Ребята, процедуры никак транзакциями не управляют.
Максимум что может быть это в chained mode при вызове
процедуры неявно начнётся транзакция.
Всё. Коммитить её в любом случае надо руками.

Так в этом то и весь вопрос - что коммитить, по идее, нужно всегда ручками,
но сервер тем не менне автоматически коммитит, если все транзакции в процедуре созданы явно.
Т.е. он делает исключение - что странно.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36483323
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KruВ цепном режиме - вызываем процедуру - открывается транзакция - далее всё что выполняется внутри транзакций в процедуре, даже если и коммитится, то должно только влиять на счётчик и само завершение процедуры не должно завершать транзакцию.
Так ведь ? (согласно доке)Так.
Используя твои процедуры в цепочном режиме, делаем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
exec test_tr()
go
select * from test
go
rollback
go
select * from test
go
Вопросы? :)

KruПо поводу глупости использования транзакций в процедурах - я бы небыл столь категориченым.А я буду.
Не знаю ни одной задачи которая требовала бы вложенных транзакций. Максимум что может быть полезным это точки сохранения, но и они на практике мне ни разу не пригодились.

KruЗачем это нужно - ну вот пример в данном топике показывает что процедура с транзакциями ведёт себя в цепном режиме по другому.Ну это прямо как по анекдоту:
- Доктор у меня вот здесь болит если туда стукнуть
- А вы туда не стукайте.
Конечно процедура с транзакциями ведет себя по разному в разных режимах. Поэтому никто в здравом уме и твердой памяти не будет делать транзакции внутри процедур. То что их можно делать, не означает что их нужно делать.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36483526
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> Конечно процедура с транзакциями ведет себя по разному в разных режимах.
> Поэтому никто в здравом уме и твердой памяти не будет делать транзакции
> внутри процедур. То что их можно делать, не означает что их нужно делать.

Мы делали всегда, делаем, и будем делать, никто нас в сумашедшие
ещё не записывал. Всё работает великолепно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36483589
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
White Owl wrote:

> Конечно процедура с транзакциями ведет себя по разному в разных режимах.
> Поэтому никто в здравом уме и твердой памяти не будет делать транзакции
> внутри процедур. То что их можно делать, не означает что их нужно делать.

Мы делали всегда, делаем, и будем делать, никто нас в сумашедшие
ещё не записывал.
Я вас записываю.

MasterZivВсё работает великолепно.Ну я так понимаю что откатывать процедуры у вас тоже нужда не возникала. И вообще все клиенты работают в режиме автокоммита.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36483773
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Используя твои процедуры в цепочном режиме, делаем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
exec test_tr()
go
select * from test
go
rollback
go
select * from test
go
Вопросы? :)


Не совсем.
Попробуйте сделать 2 процедуры - в обеих Insert в какую-нибудь dummy табличку, но только в 1й процедуре этот insert вложите в явную транзакцию.
Попробуйте выполнить их в chain mode.
Расскажите, была ли разница? По идее 1я процедура должна завершиться автокоммитом, в то время как 2я (без явной транзакции), завершится сообщением о висячей транзакции.

Если удастся это воспроизвести, то станет сразу ясно, о чём речь идёт.
С чего это вдруг, 1й случай автокоммитится, а второй нет? Если на клиенте автокоммит не установлен, то незакрытая транзакция должна оставаться незакрытой в обоих случаях, ну а если установлен, то должна в обоих случаях коммитится.
Так ведь?
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36483812
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:


> Я вас записываю.


Спасибочки

> Ну я так понимаю что откатывать процедуры у вас тоже нужда не возникала.

Возникала, откатываем.

> И вообще все клиенты работают в режиме автокоммита.

Да, и НЕ управляют транзакциями.
Но вот сейчас третье звено добавляем, будут работать и так, и так.
И в chained, и в автокомите.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36483870
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
White Owl wrote:


> Я вас записываю.


Спасибочки

> Ну я так понимаю что откатывать процедуры у вас тоже нужда не возникала.

Возникала, откатываем.

> И вообще все клиенты работают в режиме автокоммита.

Да, и НЕ управляют транзакциями.
Но вот сейчас третье звено добавляем, будут работать и так, и так.
И в chained, и в автокомите.


Так кто-нибудь попробовал воспроизвести странное поведение Sybase?
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36483877
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KruТак кто-нибудь попробовал воспроизвести странное поведение Sybase?Ну попробовал, я попробовал.
И нет, я не получил ошибки о продолжающихся транзакциях. Я получил правильную ошибку о совпадении ключей. Используя твои процедуры делаю на ASE 15.0.3#2 (извините, старее нету)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set chained on
go
test_tr 
go
  -- dbisql выдает ошибку о совпадении ключей, тыкаю в Continue
test_no_tr
go
  -- dbisql опять выдает ошибку о совпадении ключей, тыкаю в Continue
select * from test
go
  -- вижу одну строку
rollback
go
select * from test
go
  -- ни одной строки нету

Повторяю тоже самое с выключенным цепочным режимом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set chained off
go
test_tr 
go
  -- dbisql выдает ошибку о совпадении ключей, тыкаю в Continue
test_no_tr
go
  -- dbisql опять выдает ошибку о совпадении ключей, тыкаю в Continue
select * from test
go
  -- вижу одну строку
rollback
go
select * from test
go
  -- Все равно вижу одну строку


Никаких автокоммитов в цепочном режиме нету и быть не может. Только ручной с клиента.
В этом собственно говоря и есть главная разница между цепочным и нецепочным режимом. В одном первый вызов begin transaction начинает вложенную транзакцию, а во втором заменяет собой автоматическую.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36484560
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
Большое спасибо что попробовал (давайте на ты)

На пятнашке всё правильно работает, но поверь, на 12.5.4 происходит именно автокоммит.
В нашей компании ещё один программист это подтвердил и багафичу админам на исследование отправили, т.к. пока сидим на 12.5.ххх

Для меня вопрос закрыт.

Ещё раз тебе и Мастеру огромное спасибо за участие.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36484847
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KruWhite Owl,
Большое спасибо что попробовал (давайте на ты)Давно пора.

KruНа пятнашке всё правильно работает, но поверь, на 12.5.4 происходит именно автокоммит.
В нашей компании ещё один программист это подтвердил и багафичу админам на исследование отправили, т.к. пока сидим на 12.5.хххТо есть в показном мной скрипте во включеном цепочном режиме после rollback остается одна запись?
В цепочном режиме записей после отката быть не должно. А в не-цепочном после отката должна остаться одна запись.
Если это не так, то действительно баг.
...
Рейтинг: 0 / 0
ASE 12.5.4 - транзакция для одного запроса
    #36484936
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru wrote:

> Для меня вопрос закрыт.

Я попробую на 12.5 проверить.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5.4 - транзакция для одного запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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