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

Откуда:
Сообщений: 1093
Вариант с try catch работает, но я думал что без try catch должен произойти окат из за ошибки.
Или я заблуждаюсь?

create table #T1
(
  C1 int identity(1,1), 
  C2 varchar(10)
)

-- исходное состояние со "старыми данными" которые должны быть обновлены
-- в случае ошибки старые данные должны остаться
truncate table #T1; insert #T1(C2) values('a'),('b') 

begin tran T1
  --это удаление не откатывается при возникновении последующей ошибки
  delete #T1 

  --вызываем ошибку:
  insert #T1(C1, C2) values(1,'c'),(2,'d') --> ошибка 544: Cannot insert explicit value for identity column 

commit

--проверка:
select count(*) from #T1 --> 0 удаление не откатилось
6 июн 19, 17:52    [21903871]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Alexander Us,

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-2017
6 июн 19, 17:54    [21903875]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
Alexander Us
Вариант с try catch работает, но я думал что без try catch должен произойти окат из за ошибки.
Или я заблуждаюсь?
С try catch тоже не откатывает
Откат происходит, если вы вызвали rollback, либо если установлена опция xact abort
6 июн 19, 17:58    [21903882]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
alexeyvg
Alexander Us
Вариант с try catch работает, но я думал что без try catch должен произойти окат из за ошибки.
Или я заблуждаюсь?
С try catch тоже не откатывает
Откат происходит, если вы вызвали rollback, либо если установлена опция xact abort
Либо severity у ошибки такое, что отстреливается сессия.
6 июн 19, 18:01    [21903886]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
Гавриленко Сергей Алексеевич
alexeyvg
пропущено...
С try catch тоже не откатывает
Откат происходит, если вы вызвали rollback, либо если установлена опция xact abort
Либо severity у ошибки такое, что отстреливается сессия.
А, ну это да, я про нужды автора, про обработку обычных ошибок, которые оставляют транзакцию в обычном состоянии, и можно ещё много-много чего в базе наменять...
6 июн 19, 19:05    [21903958]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1093
Всем спасобо, разобрался благодаря вашим комментам.

Хотя странно, что XACT_ABORT по умолчанию в OFF.
6 июн 19, 19:58    [21903984]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
msLex
Member

Откуда:
Сообщений: 7730
Alexander Us
Хотя странно, что XACT_ABORT по умолчанию в OFF.

А что странного? Чем ON в данном случае лучше/логичнее чем OFF?
6 июн 19, 20:40    [21904010]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
msLex
Alexander Us
Хотя странно, что XACT_ABORT по умолчанию в OFF.

А что странного? Чем ON в данном случае лучше/логичнее чем OFF?
Действительно ON по умолчанию смотрелся бы лучше. Есть ошибка - прекратили, откатили. А если нужно другое поведение, то можно и поменять.

Но вот в Sybase так решили в далёких 80-х, а ломать совместимость с предыдущими версиями никто не будет.
7 июн 19, 10:24    [21904275]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49529
alexeyvg
Есть ошибка - прекратили, откатили.

Из-за ошибки в одном запросе откатывать целую транзакцию? Это к PostgreSQL.
7 июн 19, 13:23    [21904462]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
Dimitry Sibiryakov
alexeyvg
Есть ошибка - прекратили, откатили.

Из-за ошибки в одном запросе откатывать целую транзакцию?
Да, для поведения по умочанию, когда обработка ошибок не предусмотрена, это очень даже разумно.
7 июн 19, 14:01    [21904512]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
alexeyvg
msLex
пропущено...

А что странного? Чем ON в данном случае лучше/логичнее чем OFF?
Действительно ON по умолчанию смотрелся бы лучше. Есть ошибка - прекратили, откатили. А если нужно другое поведение, то можно и поменять.

Но вот в Sybase так решили в далёких 80-х, а ломать совместимость с предыдущими версиями никто не будет.
Я тут как-то повозмущался по этому поводу, - так мне сказали, что в последних версиях сервера это исправили.
Опять обманули? :((
7 июн 19, 14:25    [21904551]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
iap
так мне сказали, что в последних версиях сервера это исправили.
Опять обманули? :((
Исправили в последних версиях SSMS - появилась соответствующая настройка.
7 июн 19, 15:01    [21904595]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
invm
iap
так мне сказали, что в последних версиях сервера это исправили.
Опять обманули? :((
Исправили в последних версиях SSMS - появилась соответствующая настройка.
Имеется в виду, что настройка XACT_ABORT на свежеустановленном SSMS по умолчанию в ON?
В 2016 этого нет, может, позже сделали...

И более важно, какая настройка в созданном коннекте, если этот параметр явно не задан (SSMS же его задаёт явным образом). Для 2019 написано, что "OFF — установка по умолчанию"
7 июн 19, 20:21    [21904925]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
alexeyvg
Имеется в виду, что настройка XACT_ABORT на свежеустановленном SSMS по умолчанию в ON?
Нет. Имеется в виду, что можно настроить значение по-умолчанию для SSMS.
7 июн 19, 21:37    [21904946]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
invm
alexeyvg
Имеется в виду, что настройка XACT_ABORT на свежеустановленном SSMS по умолчанию в ON?
Нет. Имеется в виду, что можно настроить значение по-умолчанию для SSMS.
А, ну это понятно, это же называется "по умолчанию"
Смысл то в том, что начинающему лучше ставить по умолчанию XACT_ABORT, в свежеинсталлированном сиквеле, а потом уже пусть делает, как ему нужно, когда разберётся. Это же логично.
7 июн 19, 23:10    [21904973]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
alexeyvg
это же называется "по умолчанию"
это же не называется
7 июн 19, 23:11    [21904974]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
invm
alexeyvg
Имеется в виду, что настройка XACT_ABORT на свежеустановленном SSMS по умолчанию в ON?
Нет. Имеется в виду, что можно настроить значение по-умолчанию для SSMS.
Вот, ТС, с сиквелом работает с 2005 года, и для него откровение.
Для него (и миллиона других) установка XACT_ABORT ON до тех пор, пока явно не послал команду XACT_ABORT OFF, было бы более правильным.
7 июн 19, 23:13    [21904975]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1093
alexeyvg
Для него (и миллиона других) установка XACT_ABORT ON до тех пор, пока явно не послал команду XACT_ABORT OFF, было бы более правильным.


Согласен.
К тому же это более подходило бы под определение транзакции (всё или ничего).
XACT_ABORT ON может и иногда нужная опция, но это уже наворот для знатоков.
Но имеем что имеем. Просто надо (было) это знать.

Что касается стандартных установок, самой "интересной" была установка приращения файлов по 1 МБ.
8 июн 19, 00:16    [21905000]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49529
alexeyvg
для поведения по умочанию, когда обработка ошибок не предусмотрена, это очень даже разумно.

В сочетании с автоматическим стартом следующей транзакции на следующем запросе, это посылает лесом единственное полезное свойство транзакции - атомарность. С тем же успехом транзакции можно вообще выкинуть.
8 июн 19, 13:42    [21905130]     Ответить | Цитировать Сообщить модератору
 Re: почему не откатывается транзакция?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30778
Dimitry Sibiryakov
alexeyvg
для поведения по умочанию, когда обработка ошибок не предусмотрена, это очень даже разумно.

В сочетании с автоматическим стартом следующей транзакции на следующем запросе, это посылает лесом единственное полезное свойство транзакции - атомарность. С тем же успехом транзакции можно вообще выкинуть.
Когда установлен XACT_ABORT ON, то при возникновении ошибки откатывается весь пакет.
А приложение уходит на обработчик ошибок (по умолчанию - падает)

Конечно, в приложении может быть пустой трай-кетч, и тогда оно будет долбить запросами, корёжа базу. Но это ИМХО менее распространённая ситуация, понятно, что, как в поговорке, сдуру можно и транзакцию сломать.
8 июн 19, 19:28    [21905215]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить