Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не понимаю set xact_abort / 13 сообщений из 13, страница 1 из 1
12.11.2001, 15:05
    #32016867
BiSas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не понимаю set xact_abort
Я думал что при
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
12.11.2001, 15:24
    #32016868
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не понимаю set xact_abort
Читаем 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
12.11.2001, 15:40
    #32016869
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не понимаю set xact_abort
А по-моему от того что написано "Ошибка", оно не становиться серверной ошибкой
RaisError вызывает просто сообщение об ошибке, но не саму ошибку.
...
Рейтинг: 0 / 0
14.11.2001, 05:40
    #32016905
BiSas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не понимаю set xact_abort
Скорее соглашусь с Glory чем с SergSuper.
В качестве обоснования:

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

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

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

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

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

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

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

Или я все таки не прав?
...
Рейтинг: 0 / 0
14.11.2001, 14:10
    #32016945
Не понимаю set xact_abort
Отличай рантайм-ошибки от ошибок компиляции. drop table [Несуществующая таблица] - ошибка компиляции, а не времени исполнения.
...
Рейтинг: 0 / 0
15.11.2001, 05:42
    #32016989
BiSas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не понимаю set xact_abort
Глеб, позвольте не согласится.
Это именно 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
15.11.2001, 07:17
    #32017000
Не понимаю set xact_abort
Да, ты прав настчет рантаймости этой ошибки. Однако посмотри ее уровень (Level) серьезности. Уровень серьезности, с которой ошибка считается ошибкой, это с 17.

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

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

2 BiSas

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


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