Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ситуации когда транзакция становится нефиксируемой?  [new]
FreeBard
Member

Откуда:
Сообщений: 223
Добрый вечер!

Интересуют ситуации при которых транакция становится нефиксируемой (xact_state() = -1)

Один из вариантов - когда райзится ошибка при операции присваивания значения переменной

declare @n int = 'A';

Хорошо бы полный список, если есть
11 мар 15, 19:32    [17372165]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
FreeBard,

становится нефиксируемой при отсутствии возможности физически завершить транзакцию :)
11 мар 15, 22:59    [17372763]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
FreeBard
Member

Откуда:
Сообщений: 223
Владислав Колосов,

Вот мне и хотелось бы понять критерии этих физических условий

Практическая ценность может и не высокая, всегда можно проверить с помощью xact_state(), но все же.

Вот например когда исключение происходит при присвоении значения переменной
например declare @n int = 'fgfg' райзит исключение и трансакция становатся нефиксируемой.

Для меня совсен неочевидно почему в данном случае.. На переменные трансакции не действуют ведь.
12 мар 15, 17:11    [17376839]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
FreeBard
Member

Откуда:
Сообщений: 223
ну то есть например произвел операции dml, и неправильно инициализировал переменную, сервер выбросил исключение, трансакция стала нефиксируемой.
Из-за чего она становится нефиксируемой в данном случае? Ведь на данные в которые изменились в рамках трансакции это исключение никак не повлияло.
12 мар 15, 17:17    [17376883]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Например, если попытаться круглый предмет поместить в квадратное отверстие, то ничего не получатся. Или отверстия не будет вовсе. Или оно будет, но у соседа.
12 мар 15, 18:42    [17377405]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Возможно это общая реакция на ошибку такого рода.
Прекращение выполнения и откат.
12 мар 15, 18:48    [17377427]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
FreeBard
Member

Откуда:
Сообщений: 223
Владислав Колосов,

Очевидно,
такая же ситуация происходит и при инсерте, когда тип значения не совместим с типом поля

Но, например, исключение при попытке в поле типа varchar вставить значение большее по размеру (запись в результате не добавляется) на статус транзакции не влияет!

create table T (n varchar(1))

begin tran 

insert into T values('4');
insert into T values('555767')

commit tran
select * from T


Чем эта ошибка слабее чем ошибка с кривым кастом?
Причем в этом случае изменения касаются данных в таблице(ответственность трансакции),
а в случае с переменной(кривой каст) данные в таблицах не страдают, но транзакция становится нефиксируемой..
Какое вообще дело трансакции до переменных, трансакция их вообще не видит.
13 мар 15, 14:09    [17380611]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
FreeBard,

в свежесозданной сессии и после возникновения ошибки про нефиксируемую транзакцию что выведут запросы?
select 16384 & @@options

?
13 мар 15, 15:02    [17381027]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
(ошибок про нефиксируемые транзакции из-за ситуаций вида declare @n int = 'fgfg')
13 мар 15, 15:03    [17381041]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
FreeBard
Member

Откуда:
Сообщений: 223
Сон Веры Павловны,

select 16384 & @@options
возвращает 0

begin tran

declare @n int;
begin try
	set @n = 't';
end try
begin catch
	print ''
end catch

select 16384 & @@options


описание исключения
Msg 3998, Level 16, State 1, Line 1
Uncommittable transaction is detected at the end of the batch. The transaction is rolled back.
13 мар 15, 15:35    [17381338]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
FreeBard,

по-моему с varchar мы имеем контролируемое поведение, и не исключение. Группировка с NULL тоже не критична, например.
Возможно, дело в "состояние 14".
13 мар 15, 17:12    [17382069]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Владислав Колосов
FreeBard,

по-моему с varchar мы имеем контролируемое поведение, и не исключение. Группировка с NULL тоже не критична, например.
Возможно, дело в "состояние 14".

Деление на 0, например, тоже не ведет к xact_state()=-1. Хотя severity и level у этой ошибки точно такие же, как и от ошибки приведения типа.
13 мар 15, 18:28    [17382497]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
FreeBard
Member

Откуда:
Сообщений: 223
Владислав Колосов,

что значит контролируемое поведение? Сервер выбрасывает исключение.
13 мар 15, 18:39    [17382549]     Ответить | Цитировать Сообщить модератору
 Re: Ситуации когда транзакция становится нефиксируемой?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
FreeBard, в том плане, что есть выход - усечь данные того же самого типа.

state для ошибки разных типов, кстати, 1.
13 мар 15, 22:19    [17383149]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить