Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
Здравствуйте!

Всегда предполагал что содержимое хранимой процедуры выполняется внутри неявной транзакции. Но простой тест показал что это не так. Создал хранимую процедуру с двумя DELETE первый выполняется успешно, второй падает. После запуска процедуры вижу что первый DELETE таки удалил данные из базы. Т.е. транзакция не откатилась. Значит нужно явно писать BEGIN TRAN и END TRAN?
20 ноя 15, 12:13    [18446462]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
msLex
Member

Откуда:
Сообщений: 9308
Новичек sql
Всегда предполагал что содержимое хранимой процедуры выполняется внутри неявной транзакции.

вы ошибались
Новичек sql
Значит нужно явно писать BEGIN TRAN и END TRAN?

Если нужна транзакция
20 ноя 15, 12:15    [18446489]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
Всегда предполагал что содержимое хранимой процедуры выполняется внутри неявной транзакции.

Сами предпологали или начитались чего ?

Новичек sql
Значит нужно явно писать BEGIN TRAN и END TRAN?

Если вы собрались сами управлять транзакциями, то разумеется самому и придется писать соответствующие команды
20 ноя 15, 12:15    [18446491]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
Glory
Сами предпологали или начитались чего ?

Где-то слышал или прочитал...
Glory
Если вы собрались сами управлять транзакциями, то разумеется самому и придется писать соответствующие команды

Мне нужно чтобы хранимая процедура выполнялась как одна транзакция - т.е. если чего не так, откатывалась целиком. Я правильно понимаю что в этом случае нужно поставить в начале процедуры BEGIN TRAN, а перед выходом из процедуры - COMMIT?
20 ноя 15, 12:26    [18446599]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
Я правильно понимаю что в этом случае нужно поставить в начале процедуры BEGIN TRAN, а перед выходом из процедуры - COMMIT?

Для этого нужно начать читать в офф.документации о том, что такое транзакции и как ими управлять.
Чтобы потом, через некоторое время, не начинать новую тему опять словами "я всегда предполагал..."
20 ноя 15, 12:30    [18446629]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
Glory
Для этого нужно начать читать в офф.документации о том, что такое транзакции и как ими управлять.
Чтобы потом, через некоторое время, не начинать новую тему опять словами "я всегда предполагал..."

Спасибо конечно. У меня есть представление о том что такое транзакции и как ими управлять. Мысль о том что хранимая процедура создаёт неявную транзакцию показалась мне логичной...
20 ноя 15, 12:41    [18446742]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Stored Procedure
Guest
Новичек sql
Glory
Для этого нужно начать читать в офф.документации о том, что такое транзакции и как ими управлять.
Чтобы потом, через некоторое время, не начинать новую тему опять словами "я всегда предполагал..."

Спасибо конечно. У меня есть представление о том что такое транзакции и как ими управлять. Мысль о том что хранимая процедура создаёт неявную транзакцию показалась мне логичной...


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

Но если вы пользуетесь MS SQL Server, то вам придётся следовать тому, что кажется логичным разработчикам из Microsoft.
20 ноя 15, 12:46    [18446794]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
У меня есть представление о том что такое транзакции и как ими управлять.

Очень смелые слова после откровений про "автоматические" транзакции в процедуре.
Если у вас есть представление, то зачем вы спрашиваете про BEGIN TRAN/COMMIT ?

Новичек sql
Мысль о том что хранимая процедура создаёт неявную транзакцию показалась мне логичной...

Вот поэтому вам и нужно начать читать документацию.
Чтобы ваши мысли совпали с реальностью.
20 ноя 15, 12:47    [18446805]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
В итоге внутри хранимки пришлось написать так. Довольно громоздкая и нелепая конструкция...
	BEGIN TRY
		BEGIN TRANSACTION
			мои delete statements
		COMMIT TRANSACTION
	END TRY
	BEGIN CATCH
		ROLLBACK TRANSACTION 
	END CATCH
20 ноя 15, 12:48    [18446814]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
Довольно громоздкая и нелепая конструкция...

Вам бы куда-нибдь в проектировщики податься
Глядишь и станет в СУБД все "автоматически", включая транзакции.
20 ноя 15, 12:49    [18446829]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Stored Procedure
Guest
Эти ваши слова
Новичек sql
У меня есть представление о том что такое транзакции и как ими управлять.

опровергаются высказанной вами же следующей глупостью
Новичек sql
Я правильно понимаю что в этом случае нужно поставить в начале процедуры BEGIN TRAN, а перед выходом из процедуры - COMMIT?
20 ноя 15, 12:50    [18446839]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
Glory
Вот поэтому вам и нужно начать читать документацию.
Чтобы ваши мысли совпали с реальностью.

От чтения документации они могут стать лишь немного ближе к реальности. Совпадение с реальностью, к сожалению, недостижимо...
20 ноя 15, 12:51    [18446848]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Stored Procedure
Guest
Новичек sql
От чтения документации они могут стать лишь немного ближе к реальности. Совпадение с реальностью, к сожалению, недостижимо...
писать по-русски для начала научись, философ ...

нет такого слова "новичек", есть слово "новичок"
20 ноя 15, 12:54    [18446868]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
От чтения документации они могут стать лишь немного ближе к реальности. Совпадение с реальностью, к сожалению, недостижимо...

Да. Вам не надо читать документацию. Вам к врачу скорее надо. Имхо.
20 ноя 15, 12:54    [18446875]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
Glory
Вам бы куда-нибдь в проектировщики податься
Глядишь и станет в СУБД все "автоматически", включая транзакции.

Согласитесь, какое-нибудь ключевое слово для таких случаев было бы как нельзя кстати. Например CREATE AUTOTRAN PROCEDURE

Stored Procedure
нет такого слова "новичек", есть слово "новичок"

В данном случае это искусственный омоним, выражающий как мои пока неглубокие знания в ms sql, так и мой вопрос. Возможно, если бы я не поленился дотянуться до "ё", это стало бы более очевидно.

Glory
Да. Вам не надо читать документацию. Вам к врачу скорее надо. Имхо.

Спасибо за заботу. Я как раз записан на след. неделе к врачу. Хотя вряд ли стоит рассчитывать что он мне поможет с транзакциями...
20 ноя 15, 13:08    [18447005]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Stored Procedure
Guest
Новичек sql
Glory
Вам бы куда-нибдь в проектировщики податься
Глядишь и станет в СУБД все "автоматически", включая транзакции.

Согласитесь, какое-нибудь ключевое слово для таких случаев было бы как нельзя кстати. Например CREATE AUTOTRAN PROCEDURE

Stored Procedure
нет такого слова "новичек", есть слово "новичок"

В данном случае это искусственный омоним, выражающий как мои пока неглубокие знания в ms sql, так и мой вопрос. Возможно, если бы я не поленился дотянуться до "ё", это стало бы более очевидно.

Glory
Да. Вам не надо читать документацию. Вам к врачу скорее надо. Имхо.

Спасибо за заботу. Я как раз записан на след. неделе к врачу. Хотя вряд ли стоит рассчитывать что он мне поможет с транзакциями...


ну ты чо, обиделся что ли ?

вот так оформи транзакцию

BEGIN TRANSACTION;

BEGIN TRY
 
	команда 1
	команда 2
	...
	команда N

END TRY

BEGIN CATCH
    IF @@TRANCOUNT > 0       ROLLBACK TRANSACTION;
END CATCH;


IF @@TRANCOUNT > 0    COMMIT TRANSACTION;
20 ноя 15, 13:11    [18447041]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
Согласитесь, какое-нибудь ключевое слово для таких случаев было бы как нельзя кстати. Например CREATE AUTOTRAN PROCEDURE

Хорошо вам там наверное, в своем мире то ?
Про неяный запуск транзакций кстати в хелпе тоже написано. Но вам читать не надо.

Новичек sql
Спасибо за заботу. Я как раз записан на след. неделе к врачу. Хотя вряд ли стоит рассчитывать что он мне поможет с транзакциями...

Да ладно с транзакциями. Пусть хоть с реальностью поможет.
20 ноя 15, 13:12    [18447046]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Stored Procedure
Guest
Новичек sql
Stored Procedure
нет такого слова "новичек", есть слово "новичок"

В данном случае это искусственный омоним, выражающий как мои пока неглубокие знания в ms sql, так и мой вопрос.
я догадался об этом, я сам так делаю.
Ладно, не грузись сильно, новичек ... я пошутил ...
20 ноя 15, 13:15    [18447085]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
Stored Procedure
ну ты чо, обиделся что ли ?
вот так оформи транзакцию

BEGIN TRANSACTION;

BEGIN TRY
 
	команда 1
	команда 2
	...
	команда N

END TRY

BEGIN CATCH
    IF @@TRANCOUNT > 0       ROLLBACK TRANSACTION;
END CATCH;


IF @@TRANCOUNT > 0    COMMIT TRANSACTION;

Нет, не обиделся. Я редко обижаюсь, это очень вредно для здоровья.
Спасибо за пример! А в каких случаях необходимо использовать условие:
IF @@TRANCOUNT > 0  

Это какая-то best practice?

Glory
Про неяный запуск транзакций кстати в хелпе тоже написано. Но вам читать не надо.


Вы не могли бы дать ссылку на это место? Про неявный запуск транзакции в случае вызова хранимой процедуры?
20 ноя 15, 13:20    [18447123]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
Вы не могли бы дать ссылку на это место? Про неявный запуск транзакции в случае вызова хранимой процедуры?

Не могу. Потому что неявный запуск транзакции, впрочем как и явный, никак не связан с процедурами.
Т.е. ссылки на неявный запуск транзакции именно в процедуре просто не существует.
20 ноя 15, 13:23    [18447159]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
Glory
Не могу. Потому что неявный запуск транзакции, впрочем как и явный, никак не связан с процедурами.
Т.е. ссылки на неявный запуск транзакции именно в процедуре просто не существует.

Значит пока что не существует способа сказать sql server-у чтобы он автоматически выполнял хранимую процедуру как единую транзакцию?
20 ноя 15, 13:27    [18447193]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
Значит пока что не существует способа сказать sql server-у чтобы он автоматически выполнял хранимую процедуру как единую транзакцию?

Что для вас означает "автоматически" ?
Где должен быть этот автомат, который будет решать, когда начинать транзакцию, что в нее включать и когда и как завершать ?
20 ноя 15, 13:30    [18447210]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Новичек sql
Guest
Glory
Что для вас означает "автоматически" ?
Где должен быть этот автомат, который будет решать, когда начинать транзакцию, что в нее включать и когда и как завершать ?

Автоматически для меня означает что содержимое хранимой процедуры либо выполнится целиком, либо не выполнится вообще (если там есть запросы на модификацию содержимого, они откатятся). Начинать транзакцию с началом хранимой процедуры, завершать в конце. Если ошибок не происходило, то commit-ом, если что-то пошло не так, то rollback-ом.
20 ноя 15, 13:34    [18447243]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичек sql
Автоматически для меня означает что содержимое хранимой процедуры либо выполнится целиком, либо не выполнится вообще (если там есть запросы на модификацию содержимого, они откатятся). Начинать транзакцию с началом хранимой процедуры, завершать в конце. Если ошибок не происходило, то commit-ом, если что-то пошло не так, то rollback-ом.


Ваша реальность о транзакциях по-прежнему расходится с реальностью MSSQL.
Вам либо придется в своей реальности придумать свой MSSQL, либо все таки согласиться, что реальность MSSQL она и ваша реальность тоже.
20 ноя 15, 13:39    [18447276]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура и транзакция.  [new]
вижу что первый DELETE
Guest
Новичек sql
Glory
Что для вас означает "автоматически" ?
Где должен быть этот автомат, который будет решать, когда начинать транзакцию, что в нее включать и когда и как завершать ?

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

вот это и напишите в своей хранимке.

вы сейчас напрограммировали "два с половиной дерева" и думаете что это "весь лес" и есть.
организация транзакции выполняется тривиально, кроме демагогии сделать это не мешает ничто.

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

ХП - не вьюха - ее программировать надо.

есть такая опция IMPLICIT_TRANSACTIONS - в целом, включайте себе, потом расскажете, к чему пришли. и насколько это круто "неявные транзакции".
20 ноя 15, 13:44    [18447311]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить