Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_djХомяГ
В переводчике гугл

Весь хелп уже официально переведен и доступен
31 мар 16, 16:25    [19001111]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
_djХомяГ
[
То есть , как говорили выше, все рулится одной самой внешней транзакцией (внутренних нет)


А что произойдет если функция3 сделает rollback своей транзакции ? Функция1 и Функция2 закомитятся спокойно ?
А если Функция3 выбросит исключение, тогда транзакция в Функции1 откатится и прихватит с собой транзакцию Функции2 (откатит) - согласно данному описанию ?
31 мар 16, 16:44    [19001211]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Konst_One
Member

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

что вы всё про функции? или вы так ХП называете? термины нормальные применяйте. код свой сюда выкладывайте и вам расскажут, что у вас и когда откатится/закоммитится
31 мар 16, 16:52    [19001256]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Konst_One,

ок. пусть будут Хранимые процедуры :)


CREATE PROCEDURE dbo.Test1
AS 
BEGIN TRANSACTION
exec dbo.Test2
exec dbo.Test3
COMMIT TRANSACTION
END


CREATE PROCEDURE dbo.Test2
AS 
BEGIN TRANSACTION
COMMIT TRANSACTION
END

CREATE PROCEDURE dbo.Test3_1
AS 
BEGIN TRANSACTION
ROLLBACK
END


CREATE PROCEDURE dbo.Test3_2
AS 
BEGIN TRANSACTION
THROW 51000, 'The record does not exist.', 1;
COMMIT TRANSACTION
END


1. Если Test1 вызовет Test2 и Test3_1 - то данные в базе сохранятся только от Test1 и Test2 ?
2. Если Test1 вызовет Test2 и Test3_2 - то никаких данных в БД не сохранится ?
31 мар 16, 17:01    [19001321]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
19000508
31 мар 16, 17:03    [19001339]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Konst_One,

так и какой ответ ?
31 мар 16, 17:04    [19001345]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ProBiotek
Konst_One,

так и какой ответ ?

я нихачу разбираться, буду ждать пока мне всё расскажут
31 мар 16, 17:06    [19001355]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
а где репро ваше, что у вас не получается?
31 мар 16, 17:06    [19001356]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Cane Cat Fisher
Member

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

У вас невероятная каша в голове. Мало процедур и функций, еще и исключения приплели.

Исключения - это способ перехода на другой блок кода. Исключение - не обязательно фатальная ошибка. Это тот же оператор GOTO, только более культурный. Он не имеет отношения к транзакциям. В принципе, процедура вольна по исключению даже сделать COMMIT, если захочет. То, что обычно делают ROLLBACK - значит так требует конкретная задача.

Процедура - это кусок кода. Для удобства вызовов.

Транзакция - это логическая группа действий, которые в данной задаче необходимо выполнить неделино: или все вместе, или не выполнять вообще. "Логическая группа" - значит не процедура, не функция, а вот просто десять операторов, пять процедур и еще скрипт, как понадобилось программисту в этом месте. Они объединены в одно целое только в голове программиста, поэтому "логическая группа".

Если мы выполняем такую последовательность операторов, которая не требует неделимости, то транзакцию можно не открывать явно, тогда сервер будет оформлять транзакцией каждую команду. Но так вы слона не продадите ничего полезного не напишете.

Если требуется сделать что-то более сложное, то транзакция оформляется явно: либо с клиента, либо в той части серверного кода, который считается наивысшим уровнем вложенности, так что выше его, как правило, не будет необходимости управлять транзакциями более высокого уровня.

Если такая необходимость все же возникнет, то можно объявить транзакцию и на более высоком уровне вложенности, тогда внутренние транзакции в определенном смысле игнорируются. Это сделано для того, чтобы можно было вызывать любые куски кода, обрамив их в свою транзакцию, и не задумываясь о вложенных.

Изложение получилось несколько сумбурное, но оно соответствует сумбурности поставленных вопросов :)
31 мар 16, 17:10    [19001388]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Cane Cat Fisher,

Ок. Спасибо. Буду теперь понимать )
31 мар 16, 17:13    [19001411]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ппп-пп
Guest
ProBiotek
А что произойдет если функция3 сделает rollback своей транзакции ? Функция1 и Функция2 закомитятся спокойно ?


А функции в sql server ничего не могут комитить, и тем более создавать транзакции. Вот такие они вот гадкие.
31 мар 16, 17:15    [19001428]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
А вот еще, до кучи, вопрос.

При работе с Multiple Active Result Sets (MARS) есть какие-то особенности в работе транзакций ?
31 мар 16, 17:16    [19001432]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
это вообще из другой оперы
31 мар 16, 17:24    [19001470]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Konst_One,

http://www.sqlteam.com/article/multiple-active-result-sets-mars-transactions-and-debugging

Under MARS, setting savepoints, rolling back to savepoints and committing transactions isn't allowed when there is more than one request which is actively running under a transaction ...

Т.е. все же есть какие-то сложности, да ?
31 мар 16, 17:37    [19001546]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Konst_One
Member

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

вы как-то всё время сбоку заходите. если у вас есть конкретная проблема, то опишите её. такое очущение, что вы скачите по разным разделам справки и валите всё в одну кучу сами не понимая, что вам в итоге нужно.
31 мар 16, 17:41    [19001570]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
можете сами справку почитать про MARS https://msdn.microsoft.com/ru-ru/library/ms131686(v=sql.120).aspx
31 мар 16, 17:43    [19001581]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
_djХомяГ,

Спасибо ! Открыл для себя SET XACT_ABORT, и это круто !

Один вопросик разрешите.Не смог понять и нагуглить его.

Если включать SET XACT_ABORT ON, то это действует лишь данную сессию ? Т.е. мне НЕ нужно же сначала проверять текущую установку в базе, включать ее, а в конце команд восстанавливать так, как было ? Как я понимаю включив SET XACT_ABORT ON в своей области, я никому больше не помешаю - вся база данных будет жить как жила по своим правилам, какие они там были.



И еще вопрос до кучи. Почему в базе по умолчанию стоит SET XACT_ABORT OFF, если ON весьма и весьма полезен (если не сказать - критичен) ?
7 апр 16, 11:27    [19026818]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
ProBiotek,

Доп. Фактически включив SET XACT_ABORT ON в начале набора команд, я вообще могу не заботится о том, чтобы как-то возвращать данную настройку при завершении скриптов ? Что, с учетом возможных всяческих исключений, весьма упростит жизнь.
7 апр 16, 11:29    [19026836]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
И еще вопрос до кучи. Почему в базе по умолчанию стоит SET XACT_ABORT OFF, если ON весьма и весьма полезен (если не сказать - критичен) ?

Вы провели опрос о полезности среди себя ?

ProBiotek
Один вопросик разрешите.Не смог понять и нагуглить его.

Если включать SET XACT_ABORT ON, то это действует лишь данную сессию ?

Хелп не пробовали читать ? О команде SET ?
7 апр 16, 11:34    [19026875]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Glory,

https://msdn.microsoft.com/ru-ru/library/ms188792(v=sql.120).aspx

Нету информации про то, устанавливается ли данная настройка на уровне сессии/соединения или нет.
Сказано, лишь, что по умолчанию в БД стоит OFF
7 апр 16, 11:51    [19026962]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Glory,

Какие минусы от установки в ON ? Что препятствует от установки в ON на уровне всей базы навсегда ?
7 апр 16, 11:54    [19026986]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Какие минусы от установки в ON ?

Вы решили устроить опрос тут ?

ProBiotek
Что препятствует от установки в ON на уровне всей базы навсегда ?

Например, обратная совместимость
7 апр 16, 11:55    [19026992]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Нету информации про то, устанавливается ли данная настройка на уровне сессии/соединения или нет.
Сказано, лишь, что по умолчанию в БД стоит OFF

Я сказал, хелп о команде SET.
А не хелп о SET XACT_ABORT
Вы когда нибудь научитесь _читать целиком_ то, что вам пишут ?

Сообщение было отредактировано: 7 апр 16, 11:56
7 апр 16, 11:56    [19026996]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Glory
ProBiotek
Какие минусы от установки в ON ?

Вы решили устроить опрос тут ?

ProBiotek
Что препятствует от установки в ON на уровне всей базы навсегда ?

Например, обратная совместимость


Почему нет ? Это же форум.

А если не нужна обратная совместимость (например база и проект новые) то можно установить в ON и радоваться ?
7 апр 16, 12:00    [19027022]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Glory
ProBiotek
Нету информации про то, устанавливается ли данная настройка на уровне сессии/соединения или нет.
Сказано, лишь, что по умолчанию в БД стоит OFF

Я сказал, хелп о команде SET.
А не хелп о SET XACT_ABORT
Вы когда нибудь научитесь _читать целиком_ то, что вам пишут ?


Спасибо, прочитал - вроде как написано, что после выполнения процедур все восстанавливается.
Я не знал, что эта команда разбивается на 2 части :) И что нужно читать по каждой части отдельно :)
7 апр 16, 12:03    [19027030]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить