powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не понимаю set xact_abort
13 сообщений из 13, страница 1 из 1
Не понимаю set xact_abort
    #32016867
BiSas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я думал что при
set xact_abort on
после возникновения ошибки должно прекращатся выполнение кода.
Но этот пример демонстрирует обратное. Может кто-нибудь пояснить на какие случаи расчитан set xact_abort on

create procedure test
as
set xact_abort on
select '1'
RaisError('Oшибка',16,1)
select '2'

go

exec test

****** Результат выполнения **********************************

----
1

(1 row(s) affected)

Server: Msg 50000, Level 18, State 1, Procedure test, Line 6
Oшибка

----
2

(1 row(s) affected)

*************************************************************
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32016868
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаем BOL
"SET XACT_ABORT
Specifies whether Microsoft® SQL Server™ automatically rolls back the current transaction if a Transact-SQL statement raises a run-time error."

Ни о каком прекращении выполнения кода речи не идет
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32016869
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по-моему от того что написано "Ошибка", оно не становиться серверной ошибкой
RaisError вызывает просто сообщение об ошибке, но не саму ошибку.
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32016905
BiSas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее соглашусь с Glory чем с SergSuper.
В качестве обоснования:

RaisError('Ошибка',16,1)
select @@Error

***Результат выполнения*********************
Server: Msg 50000, Level 16, State 1, Line 1
Ошибка

-----------
50000

(1 row(s) affected)
********************************************
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32016906
Как бы то там ни было, но действие RAISERROR отличается от настоящих рантайм-ошибок (типа нарушение вторичного ключа или уникальности). Настоящие-таки ошибки прерывают исполнение кода и откатывают транзакцию при SET XACT_ABORT ON. О том, что RAISERROR не работает под SET XACT_ABORT ON, как ожидается, давно известно.
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32016944
BiSas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если заменить
RaisError('Ошибка', 16, 1)
на
drop table [Несуществующая таблица]
, то результат будет тем же самым. Так что RaisError тут не при чем.

Я сейчас не могу утверждать точно, но помоему после каких-то ошибок происходит прерывание исполнения кода.
Или все таки прав Glory?

Причем Severity здесь как бы не при чем.

Если нельзя четко прогнозировать поведение исполняемого кода,
то выходит что лучше пользоваться громоздким способом
set xact_abort off
c последующей обработкой переменной @@Error после каждого критичного участка кода.

Или я все таки не прав?
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32016945
Отличай рантайм-ошибки от ошибок компиляции. drop table [Несуществующая таблица] - ошибка компиляции, а не времени исполнения.
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32016989
BiSas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Глеб, позвольте не согласится.
Это именно Runtime ошибка.
Пример ниже это демонстрирует:

create procedure Test
as
set xact_abort on
select '1'
drop table [Несуществующая таблица]
select '2'
go

exec Test

*****Результат выполнения***********************************
----
1

(1 row(s) affected)

Server: Msg 3701, Level 11, State 5, Procedure Test, Line 5
Cannot drop the table 'Несуществующая таблица', because it does not exist in the system catalog.

----
2

(1 row(s) affected)
***********************************************************
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32017000
Да, ты прав настчет рантаймости этой ошибки. Однако посмотри ее уровень (Level) серьезности. Уровень серьезности, с которой ошибка считается ошибкой, это с 17.

BOL: Severity levels from 17 through 25 indicate software or hardware errors.
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32017002
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Глеб Уфимцев

severеty практически не влияет на поведение этой опции, во всяком случае я генерил ошибку с различными severety и отката транзакции не происходило.

2 BiSas

Не так давно я исследовал поведение сервера при включении этой опции, насколько я понял, прекращение исполнения кода и откат транзакции происходит только при возникновении runtime ошибок в выражениях update и insert.
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32017007
BiSas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо всем за полезную дискуссию!!!
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32017012
Я разве утверждал обратное насчет raiserror? То, что я говорил насчет severity, к raiserror отношения не имеет. Имелись в виду "родные" ошибки в том контексте.
...
Рейтинг: 0 / 0
Не понимаю set xact_abort
    #32017014
Меня, кстати, тоже раздражает такое поведение raiserror, да и вообще отсутствие обработки ошибок и исключений в mssql. Не понимаю, почему ms до сих пор об этом не озадачилась в продукте, который они продают весьма недешево.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не понимаю set xact_abort
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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