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

Откуда:
Сообщений: 111
Есть три процедуры, вызывемые одна за другой. При запуске PROCEDURE ProcedureName1 выдает ошибку:
Нефиксируемая транзакция обнаружена в конце пакета. Был выполнен откат транзакции.
Как узнать, где именно возникла проблема с вложенной транзакцией?

CREATE PROCEDURE ProcedureName1
	<параметры>
AS BEGIN BEGIN TRY
	SET NOCOUNT ON;
	DECLARE	 @SubTran	Bit		= CASE	WHEN @@TranCount > 0 AND Xact_State() = 1 THEN 1 ELSE 0 END
		<декларативная часть>
	IF (@SubTran = 1)
		SAVE  TRAN FirstTran
	ELSE	BEGIN TRAN FirstTran
--------------------------------------------------------------------------------
	INSERT dates in Table1
	INSERT dates in Table2
	UPDATE dates in Table3	
		EXEC ProcedureName2 (параметры)
-------------------------------------------------------------------------------
	IF (@SubTran = 0)
		COMMIT TRAN FirstTran
END TRY
BEGIN CATCH
	IF (@@TranCount > 0)
	AND(Xact_State() = 1)
		ROLLBACK TRAN FirstTran
		DECLARE	 @Error		NVarChar(2048) = Error_Message()
	RAISERROR(@Error)WITH LOG;
	RETURN	@@Error
END CATCH
END

CREATE PROCEDURE ProcedureName2 (параметры)
	 <параметры>
AS BEGIN BEGIN TRY
	SET NOCOUNT ON;
	DECLARE	@SubTran	Bit	= CASE	WHEN @@TranCount > 0 AND Xact_State() = 1 THEN 1 ELSE 0 END
	<декларативная часть>
	IF (@SubTran = 1)
		SAVE  TRAN SecondTran
	ELSE	BEGIN TRAN SecondTran
--------------------------------------------------------------------------------
	INSERT dates in Table1
	EXEC ProcedureName3 (параметры)
-------------------------------------------------------------------------------
	IF (@SubTran = 0)
		COMMIT TRAN SecondTran
END TRY BEGIN CATCH
	IF (@@TranCount > 0)
	AND(Xact_State() = 1)
		ROLLBACK TRAN SecondTran

	DECLARE	@Error NVarChar(2048) = Error_Message()
	RAISERROR('%s',18,1,@Error);
	RETURN	@@Error
END CATCH END

CREATE PROCEDURE ProcedureName3 (параметры)
AS BEGIN BEGIN TRY
	DECLARE	@SubTran	Bit	= CASE WHEN @@TranCount > 0 AND Xact_State() = 1 THEN 1 ELSE 0 END
	IF (@SubTran = 1)
		SAVE  TRAN ThirdTran
	ELSE	BEGIN TRAN ThirdTran
--------------------------------------------------------------------------------
<декларативная часть>
--------------------------------------------------------------------------------
INSERT dates in Table2
UPDATE dates in Table3
--------------------------------------------------------------------------------
IF (@SubTran = 0)
		COMMIT TRAN ThirdTran
END TRY
BEGIN CATCH
	IF (@@TranCount > 0)
	AND(Xact_State() = 1)
		ROLLBACK TRAN ThirdTran
	SELECT	@Error	= Error_Message() + IsNull('Line: ' + Convert(VarChar,Error_Line()),'')
	RAISERROR('%s',18,1,@Error)
	RETURN	@@Error
END CATCH
END
6 авг 13, 16:53    [14670893]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxiMaxiM
Как узнать, где именно возникла проблема с вложенной транзакцией?

Полное сообщение об ошибке содержит имя процедуры и номер строки
6 авг 13, 17:01    [14670982]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
Glory,
PROCEDURE ProcedureName1, строка

IF (@@TranCount > 0)
AND(Xact_State() = 1)
ROLLBACK TRAN SecondTran
6 авг 13, 17:13    [14671081]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Максим, во первых можно задать вопрос у старших.
Но надо просто подправить генерацию строки @Error (добавить Error_Procedure()) или посмотреть логи (если WITH LOG срабатывает - отсылает письмо, спроси Админа).
"Нефиксируемая транзакция" - это что-то с оракаклом или MySql или что-то подобное.
Т.е. тут решением частной проблемы задачи не пойдёт, надо разобраться и пресечь подобное.
6 авг 13, 18:02    [14671531]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Максим
Тьфу. Ладно Не-Мексим, так и буду называть.
6 авг 13, 18:05    [14671545]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
TRY...CATCH Там даже примеры есть.
Error_Procedure()

MaxiMaxiM
Нефиксируемая транзакция обнаружена в конце пакета. Был выполнен откат транзакции.
Должна идти вместе с другой ошибкой. Это "побочная" добавляется апосля, особого дополнительного смысла не несёт.
6 авг 13, 18:27    [14671661]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
Mnior,
есть Невозможно использовать инструкцию ROLLBACK внутри инструкции INSERT-EXEC.
6 авг 13, 18:29    [14671675]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
MaxiMaxiM
Невозможно использовать инструкцию ROLLBACK внутри инструкции INSERT-EXEC.
Ошибка разработки. Или выбрали из 2х зол меньшее. Будь он INSERT-EXEC неладен.
Нашёл его в простыне кода:
автор
	INSERT dates in Table1
	EXEC ProcedureName3 (параметры)
Мог бы и догадаться.

Или переписать этот кусок INSERT EXEC - через нормальный механизмы.
Или искать очередную причину, дописывать её в условия проверок ДО начала "процесса".

А искать надо практически запусками кусков. Не сахар.

Я бы переписал. Но вы не будете этого делать ;)
6 авг 13, 19:47    [14671884]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
MaxiMaxiM,

Людмила Прокофьевна, где вы набрались этой пошлости? ((c) х\ф Служебный роман).

Что это за лапшекод? Что за задачу решаете?
6 авг 13, 19:48    [14671892]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin
Что это за лапшекод?
Я бы сказал ... пару ласковых.

А в чём лапша то?
- В TRY/CATCH обёртке процедур?
- В Nested вызовах?

PS: <Перестал махать вьюхой и притих>
6 авг 13, 20:47    [14672113]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Mnior
А в чём лапша то?
- В TRY/CATCH обёртке процедур?
- В Nested вызовах?


Пичалька "обертки в TRY/CATCH процедур" шипко сильно зависит от того, как тот, кто будет писАть вложенную хп будет следовать принципу приведенного лапшекода.

Сопровождать сие чудо на Prod окружении - никому не позавидую. Учитывая, что автономных транзакций в MS SQL нет, а вложенные - это синтаксический сахар, все приведенные ТС потуги ничего, кроме сарказма вызвать не могут.
6 авг 13, 20:55    [14672139]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Mnior,

И вот это вот вызывает у меня особенную пичальку:

RAISERROR(@Error) WITH LOG
6 авг 13, 21:04    [14672170]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
pkarklin
Сопровождать сие чудо на Prod окружении - никому не позавидую. Учитывая, что автономных транзакций в MS SQL нет, а вложенные - это синтаксический сахар, все приведенные ТС потуги ничего, кроме сарказма вызвать не могут.
+1

Зачем всё это?

Достаточно при ошибке откатывать транзакцию и передавать ошибку наверх.

Если речь о версии до 2012, то лучше передавать используя THROW, если до 2012, то я бы делал простую обработку - проверять после стейтмента @@error и выходить с откатом транзакции.
6 авг 13, 21:29    [14672275]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
alexeyvg
Если речь о версии до 2012, то лучше передавать используя THROW
То есть разумеется начиная с 2012
6 авг 13, 21:30    [14672279]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin
Пичалька "обертки в TRY/CATCH процедур" шипко сильно зависит от того, как тот, кто будет писАть вложенную хп будет следовать принципу приведенного лапшекода.
Что-то я ниуя не понял.
Вы говорите что существует альтернативный, но универсальный вариант? Серьёзно?
Любой "подход" взаимо несовместим. Т.е. по вашей логике любой может на любой код сказать - лапша. Ну и с смысл сотрясать воздух?

pkarklin
Учитывая, что автономных транзакций в MS SQL нет, а вложенные - это синтаксический сахар, все приведенные ТС потуги ничего, кроме сарказма вызвать не могут.
1. Причём тут автономки вообще?
2. Вложенки? Разуйте глаза - ими там и не пахнет.
Или вы хотите сказать что откат сейвпоинтов - миф?!

alexeyvg
Достаточно при ошибке откатывать транзакцию и передавать ошибку наверх.
Мне считать +1 в сторону сборища админов, в глаза не видящие реальные сложные бизнес задачи или +1 к троллингу?

В 95% оно так и есть, но этот пресловутый 5%, когда откат приводит к альтернативным действиям - сводят к такому вот раздуванию кода и пресловутым корпоративным шаблонам.

Вы то думаете что существует, лять, одна целая ундер-транзакция, ага, на все сервисы мира. Уяк и сразу откатило пол мира с разными подходами и стратегиями проведения операций. Или вы будете навязывать какие TRY/CATCH делать надо на скуле, а какие в апликешн сервисах, а какие не кошерно?

Очередной привет любителям процедур от махающих вьхами. (может кто-то наконец почувствует всю глубину осадного положения)
Жду с нетерпением конструктивных конкретных предложений. Пусть матерые научат нубов.
pkarklin
И вот это вот вызывает у меня особенную пичальку:
RAISERROR(@Error) WITH LOG
Пичалько то в чём, в кривом C&P или WITH LOG - табу?
И чем она особенная? В том что предыдущие были пустыми?

PS: Кто-то что-то чем-то почувствовал и решил поймать лулзов?
PPS: Надёюсь не перегнул в привлечении внимания.
7 авг 13, 00:40    [14673090]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin
Пичалька "обертки в TRY/CATCH процедур" шипко сильно зависит от того, как тот, кто будет писАть вложенную хп будет следовать принципу приведенного лапшекода.
Вложенную? Ипать.
Двойной логический разрыв шаблона:
1. Ричи - создатель прикладного ПО, а все остальные так, пописывают говно-компиляторы, ОСи и системные либы.
2. "Вот пишу базовую функцию под готовое конкретное использование, что посоветуете - смотреть на принципы или плюнуть и сделать по своему?".

Как-то не смешные анекдоты.

PS: Мужики, вы хоть чувство троллинга то развивайте, а то какой-то он и не тонкий, да и профита мало.
PPS: Тон можно подстроить под уровень внешней восприимчивости. По первому требованию.
PPPS: Чем выше уровень - тем больше спрос. Это такой комплимент.
7 авг 13, 00:55    [14673117]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Вопрос немного в стороне от темы. Отцы форума, подскажите, как можно искусственно создать ситуацию, когда
"Нефиксируемая транзакция обнаружена в конце пакета".

Нужно для тестовых игрищ с транзакциями.
7 авг 13, 10:04    [14673775]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Гость333
Member

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

Позволю себе ответить, хоть я и не "отец форума", а максимум "младший брат-детсадовец"...

begin transaction

begin try
   declare @zero float = 0
   select log(@zero)
end try
begin catch
end catch

print 'xact_state = ' + cast(xact_state() as varchar)

commit
7 авг 13, 10:22    [14673911]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Хаа, красавчек!

Я пытался лог от -1 брать, а он мне говорил "Попытка выполнить недопустимую операцию с плавающей запятой."

А через переменную то, что нужно. Ну просто удивительно =)
7 авг 13, 10:29    [14673968]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Mnior
Мне считать +1 в сторону сборища админов, в глаза не видящие реальные сложные бизнес задачи или +1 к троллингу?

В 95% оно так и есть, но этот пресловутый 5%, когда откат приводит к альтернативным действиям - сводят к такому вот раздуванию кода и пресловутым корпоративным шаблонам.


Можно для сборища админов, которые в глаза не видели сложные бизнес-задачи, привести пример практической задачи, которая не решается без отката к сэйвпоинту?

Mnior
Вы то думаете что существует, лять, одна целая ундер-транзакция, ага, на все сервисы мира. Уяк и сразу откатило пол мира с разными подходами и стратегиями проведения операций. Или вы будете навязывать какие TRY/CATCH делать надо на скуле, а какие в апликешн сервисах, а какие не кошерно?


Вспоминаем времена, когда TRY\CATCH и в помине не было и мегабизнесзадачи как-то решались. Никому ничего не собираюсь навязывать, но сабжевый говнокод на Production никогда не выпущу.

Mnior
Очередной привет любителям процедур от махающих вьхами.


У процедур не любители, а профессионалы.

Mnior
Пичалько то в чём, в кривом C&P или WITH LOG - табу?


Пичалька в том, что для использования WITH LOG необходимо членство в серверной роли sysadmin или наличие серверной привилегии ALTER TRACE. Если у ТС система работает при таких условиях, то это трындец.

Mnior
у с нетерпением конструктивных конкретных предложений.


Постулат №1: нет никаких 5%, при которых необходимо выполнить откат произведенных действий.
Постулат №2: синтаксический сахар вложенных транзакций MS SQL позволяет совсем просто и без приведенного выше лапшекода решать задачи бизнес-транзакций на стороне СУБД. Схематично шаблон выглядит так:

CREATE PROC SomeProc ...
AS
SET XACT_ABORT ON
BEGIN TRAN
--Some BP Proccesing
--IF Some BP CHECK = FALSE
-- EXEC что-то, что откатит транзакцию по самые помидоры и прервет бач
COMMIT
GO 



И не важно, на каком уровне вызвана эта хп. Хоть напрямую с клиента, хоть на 31ом уровне вложенности хп, написанных по такому же шаблону.

Сообщение было отредактировано: 7 авг 13, 20:34
7 авг 13, 17:25    [14677212]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
автор
-- EXEC что-то, что откатит транзакцию по самые помидоры и прервет бач



Чего экзек?
7 авг 13, 18:20    [14677560]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Cammomile
автор
-- EXEC что-то, что откатит транзакцию по самые помидоры и прервет бач



Чего экзек?


А к чему может быть применен EXEC, кроме как к хп? (Вызов скалярной UDF в стиле вызова хп предлагаю здесь не обсуждать, тем более, что она тут не поможет.)

pkarklin
что откатит транзакцию по самые помидоры и прервет бач.


Cammomile, Вам не ведома такая "инструкция"?

Сообщение было отредактировано: 7 авг 13, 18:47
7 авг 13, 18:46    [14677701]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Мне неведомо зачем роллбек тран оборачивать в обёртку.
7 авг 13, 20:26    [14678036]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Cammomile
Мне неведомо зачем роллбек тран оборачивать в обёртку.

Предложите альтернативное решение вне зависимости от глубины стека вызовов для:

pkarklin
откатит транзакцию по самые помидоры и прервет бач


Сообщение было отредактировано: 7 авг 13, 20:32
7 авг 13, 20:31    [14678053]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Троллинг продолжается? Ок.
pkarklin
Можно привести пример практической задачи, которая не решается без отката к сэйвпоинту?
Обана, стандартный троллевский финт ушами.
Смотрим первоначальное заявления:
Mnior
Или вы хотите сказать что откат сейвпоинтов - миф?!
alexeyvg
Достаточно при ошибке откатывать транзакцию и передавать ошибку наверх.
... когда откат приводит к альтернативным действиям
Чё pkarklin, притворимся что вы проффтыкали кто что сказал?

pkarklin
Вспоминаем времена, когда TRY\CATCH и в помине не было и мегабизнесзадачи как-то решались. Никому ничего не собираюсь навязывать, но сабжевый говнокод на Production никогда не выпущу.
Ипать логика.
Т.к. в вянде 3.11 небыло функции X, то её использование назовём лапшёвый говнокод и будем тоталитарно запрещать использовать где либо?
Маразм крепчал.

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

Вот я жалею что игнорировал обсуждения на форуме по шаблонам процедурок и т.п. с подходами, которые были или олдскульные - приводящие к морую кода аля IF @@Error != 0 или имеющие вывернутое нестандартное взаимодействие с клиентом. И явно не так как сейчас советует MS.
pkarklin
...Пичалька в том, что для использования WITH LOG необходимо членство в серверной роли sysadmin или наличие серверной привилегии ALTER TRACE. Если у ТС система работает при таких условиях, то это трындец.
Вот не помню, но то ли опять вы или ктось иной мега-гуру уже нарвались на те же грабли памяти:
+ Работающий код без вcяких ALTER TRACE и sysadmin ролей
USE tempdb
GO
CREATE PROC dbo.spTestError
WITH EXECUTE AS OWNER 
AS RAISERROR('%s',4,1,'Test')WITH LOG;
GO
CREATE LOGIN temp WITH PASSWORD=N'test', DEFAULT_DATABASE=tempdb, CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
CREATE USER temp FOR LOGIN temp WITH DEFAULT_SCHEMA=dbo
GRANT EXECUTE ON dbo.spTestError TO temp
GO
-- Login with test
EXEC dbo.spTestError			-- OK
RAISERROR('%s',4,1,'Test')WITH LOG;	-- Error
GO
DROP PROC dbo.spTestError;
DROP USER temp;
DROP LOGIN temp;

pkarklin
Постулат №1: нет никаких 5%, при которых необходимо выполнить откат произведенных действий.
1. Переврали мои слова:
Mnior
пресловутый 5%, когда откат приводит к альтернативным действиям
2. Вы же только что сказали:
pkarklin
Можно привести пример практической задачи, которая не решается без отката к сэйвпоинту?
Или вы склонны что откат к сейвпоинту для альтернативных действий (вместо полного отката транзакции) встречается намного чаще?
pkarklin
Постулат N2: синтаксический сахар вложенных транзакций MS SQL позволяет совсем просто и без приведенного выше лапшекода решать задачи бизнес-транзакций на стороне СУБД. Схематично шаблон выглядит так:
CREATE PROC SomeProc ...
AS
SET XACT_ABORT ON
BEGIN TRAN
--Some BP Proccesing
--IF Some BP CHECK = FALSE
-- EXEC что-то, что откатит транзакцию по самые помидоры и прервет бач
COMMIT
GO 
Вы всё ещё не вкуриваете:
1. Где в вашем крутяшном "шаблоне" выполнить алтернативное действие - при ошибке "Some BP Proccesing" без отката всей транзакции? Где сейфпоинты?
2. Вы будете проверять IF-ами каждую грёбанную команду в "Some BP Proccesing"? Где TRY/CATCH?

pkarklin
И не важно, на каком уровне вызвана эта хп. Хоть напрямую с клиента, хоть на 31ом уровне вложенности хп, написанных по такому же шаблону.
И как 30-й уровень бизнес логики сможет выполнить альтернативное действие при ошибке этой грёбаной SomeProc, если она куяк и "откатит транзакцию по самые помидоры и прервет бач"?
Ваша процедура ломает логику вышестоящих уровней напроч.

А вот в шаблоне от MaxiMaxiM вы увидите, что он не будет задевать логику вышестоящего узла и при этом будет работать как надо - выкидывать ошибки и откатывать все свои действия. Чистый Unix way.

Я просто в ахуе, ну никак я не ожидал столь нубских высказываний от гуру, от вас pkarklin.
Хотя с кем не бывает. Туман сознания, возраст.
7 авг 13, 20:44    [14678095]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить