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

Откуда:
Сообщений: 1100
Возможно, для вас это не новость, но я сегодня был очень удивлён (хотя, если поразмыслить, то становится понятно, почему это так сделано), обнаружив, что при выполнении конструкции
insert into [table] exec sp_procedure
неявно открывается транзакция, в которой и работает хранимка.
13 сен 04, 18:34    [956084]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Открытие транзакции здесь не связано с процедурой. Оно связано с тем, что выполнение стейтментов в отсутствии явно объявленной транзакции и SET IMPLICIT_TRANSACTIONS OFF (дефолт) производится в неявной транзакции. Как и положено.
13 сен 04, 18:46    [956118]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
tRaQ
Member

Откуда:
Сообщений: 165
добавлю, что в конструкции
insert MyLinkedServer.MyCatalog.dbo.MyTable exec sp_MySP
в дело включается DTC :)
13 сен 04, 18:46    [956120]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
Насколько я знаю, при insert,update она всегда неявно открывается, если явно не объявлена..
13 сен 04, 18:46    [956121]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Alexes
Member

Откуда:
Сообщений: 1100
GreenSunrise
Открытие транзакции здесь не связано с процедурой. Оно связано с тем, что выполнение стейтментов в отсутствии явно объявленной транзакции и SET IMPLICIT_TRANSACTIONS OFF (дефолт) производится в неявной транзакции. Как и положено.

То, что не связано непосредственно с процедурой - это я понимаю. Однако, значение IMPLICIT_TRANSACTIONS ни на что не влияет.

Ден
Насколько я знаю, при insert,update она всегда неявно открывается, если явно не объявлена..

Ну, как я и написал вначале, теперь мне понятно, почему это происходит. Но я не ожидал, что ВСЯ хранимка будет выполняться в транзакции. Можно было бы включить в транзакцию только вставку возвращаемых данных.
13 сен 04, 18:58    [956146]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Alexes
Но я не ожидал, что ВСЯ хранимка будет выполняться в транзакции. Можно было бы включить в транзакцию только вставку возвращаемых данных.
Зачем ожидать или не ожидать? Достаточно просто заглянуть в BOL в статью SET IMPLICIT_TRANSACTIONS, где сразу же, почти в первых строках написано черным по белому:

When a connection is in implicit transaction mode and the connection is not currently in a transaction, executing any of the following statements starts a transaction:

после чего приведена табличка с перечислением всех выражений, которые начинают транзакцию (в них входит и INSERT).
14 сен 04, 07:00    [956539]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Alexes
Member

Откуда:
Сообщений: 1100
tpg
Зачем ожидать или не ожидать? Достаточно просто заглянуть в BOL в статью SET IMPLICIT_TRANSACTIONS, где сразу же, почти в первых строках написано черным по белому:

When a connection is in implicit transaction mode and the connection is not currently in a transaction, executing any of the following statements starts a transaction:

после чего приведена табличка с перечислением всех выражений, которые начинают транзакцию (в них входит и INSERT).

Вы хотите сказать, что если я напишу SET IMPLICIT_TRANSACTIONS OFF, то транзакция не начнётся?
14 сен 04, 09:52    [956812]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вы хотите сказать, что если я напишу SET IMPLICIT_TRANSACTIONS OFF, то транзакция не начнётся?
Транзакция начнется в любом случае. Просто при SET IMPLICIT_TRANSACTIONS ON вы после insert ...exec должны будете еще явно выполнить COMMIT или ROLLBACK.
14 сен 04, 10:01    [956830]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
BOL: When ON, SET IMPLICIT_TRANSACTIONS sets the connection into implicit transaction mode. When OFF, it returns the connection to autocommit transaction mode.
14 сен 04, 10:02    [956837]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Glory
Транзакция начнется в любом случае...

Вот это меня и удивило.
14 сен 04, 10:10    [956871]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну так уже несколько раз повторили в этом топике - при отсутствии явных транзакций все команды обновдения данных работатют в режиме неявных транзакций.
Вас же не удивляет наличие транзакции при insert mytable values(...) ? Или удивляет ?
14 сен 04, 10:14    [956883]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Glory
Вас же не удивляет наличие транзакции при insert mytable values(...) ? Или удивляет ?

Нет, а про удивление я пишу в прошедшем времени. :)
14 сен 04, 10:46    [957067]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Alexes
Member

Откуда:
Сообщений: 1100
В общем, закроем тему.
14 сен 04, 10:48    [957077]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
Alexes
Glory
Вас же не удивляет наличие транзакции при insert mytable values(...) ? Или удивляет ?

Нет, а про удивление я пишу в прошедшем времени. :)


Ради интереса поэкспериментировал с конструкцией
insert into [table] exec sp_procedure
так, чтобы в sp_procedure был блок begin tran ... commit tran, и затем результирующий select. И был удивлен.
Оказывается, обсуждаемая неявная транзакция роллбэчит вложенную казалось бы откоммиченную.!!!
14 сен 04, 18:51    [959330]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Ну ё-мое, сотый раз одно и то же. Нет у MS SQL Server вложенных транзакций. Потому самый внешний роллбэк откатит все вложенные коммиты.
14 сен 04, 20:02    [959478]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
2 GreenSunrise :Что же такое тогда "Вложенные транзакции"?
14 сен 04, 21:22    [959566]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Что же такое тогда "Вложенные транзакции"?


В MSSQL это только увеличение @@TRANCOUNT


--------------
Свет в конце тонеля временно потушен по техническим причинам.
15 сен 04, 10:46    [960302]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
GreenSunrise
Ну ё-мое, сотый раз одно и то же. Нет у MS SQL Server вложенных транзакций. Потому самый внешний роллбэк откатит все вложенные коммиты.

Мне кажется, это придется повторять еще много сотен раз для тех кто не сталкивался с этим:-(
Согласитесь, что логика транзакций SQL Server неочевидна/нетрадиционна и, в обсуждаемом случае например, возмутительно что неявный (Вы его не заказывали) роллбэк откатывает явные (Вами проставленные) коммиты.
Прошу прощения у публики за "одно и то же", по этой теме "закрываюсь".
15 сен 04, 11:03    [960365]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Пора, пора уже читать хелп. Берем слово ROLLBACK, ищем его в хелпе и внимательно читаем слова:

ROLLBACK TRANSACTION without a savepoint_name or transaction_name rolls back to the beginning of the transaction. When nesting transactions, this same statement rolls back all inner transactions to the outermost BEGIN TRANSACTION statement. In both cases, ROLLBACK TRANSACTION decrements the @@TRANCOUNT system function to 0.

Также вообще внимательно читаем всю статью целиком - ROLLBACK TRANSACTION, в частности о механизме savepoint'ов.
15 сен 04, 11:08    [960389]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
В чём "неочевидность" логики вложенных транзакций MSSQL?
Для меня вполне естественно, что внешний ROLLBACK откатывает внутренние COMMIT. Если нужно другое поведение -нефиг "вкладывать" транзакции, запускать в отдельном коннекте
15 сен 04, 11:17    [960426]     Ответить | Цитировать Сообщить модератору
 Re: Удивительное рядом. (insert ... exec)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Понятие очевидности/неочевидности применительно к софту вообще расплывчато. Есть куда более правильное понятие - документированность и соответствие реального поведения документации.

Есть еще понятие соответствия стандартам. Если у кого под рукой завалялся ANSI SQL, можно там порыться на предмет данной темы.

Если в нем не будет описания стандартного поведения для данного случая, то все крики о неправильности, неявности и т.д. бессмысленны по определению - каждый производитель конкретного SQL-сервера имеет право реализовывать его как хочет.
15 сен 04, 11:27    [960472]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить