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

Откуда:
Сообщений: 13148
TRY / CATCH + транзакции + хранимки = опять

Server: Msg 266, Level 16, State 2, Procedure xxp, Line 0
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.

и теперь ЭТО уже не обойти?
10 июл 09, 19:05    [7403660]     Ответить | Цитировать Сообщить модератору
 Re: Здраствуй, елка, новый год?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3200
Если есть внешняя транзакция по отношению к вызову ХП, то и соответствующий TRY/CATCH сделать надо.

Или я не понял.
10 июл 09, 19:51    [7403808]     Ответить | Цитировать Сообщить модератору
 Re: Здраствуй, елка, новый год?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
да я все про независимость объектов друг от друга.. а в T-SQL нельзя так, надо всегда думать о тех, кто твою хранимку вызывает и наоборот.. и с каждой фичей такая зависимость все более извращенная
13 июл 09, 11:21    [7407327]     Ответить | Цитировать Сообщить модератору
 Re: Здраствуй, елка, новый год?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А хотя бы схематично описать процедуру можно?
13 июл 09, 11:35    [7407415]     Ответить | Цитировать Сообщить модератору
 Re: Здраствуй, елка, новый год?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
есть одна хранимка. она делает вставки в таблицу. не пустая, ессно, хранимка, с логикой. логика старая. в логике полно RAISERROR

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

обертка была переписана с TRY / CATCH. ура! в таблицу протокола пишутся "полные" сообщения + нет обращения к sysmessages

упс. "обертка", оказывается, вызывалась из еще одной внешней прикладухи во ВНЕШНЕЙ транзакции. соответственно, "transactions count after execute" - получите и распишитесь
13 июл 09, 11:48    [7407464]     Ответить | Цитировать Сообщить модератору
 Re: Здраствуй, елка, новый год?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3200
SAVE TRAN может вас спасти, думаю.
13 июл 09, 11:52    [7407491]     Ответить | Цитировать Сообщить модератору
 Re: Здраствуй, елка, новый год?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ээээээ-ммм...
Может переписать так (хотя, криво канешна...): переписываем блок CATCH - фиксим в локальной переменной @@trancount, откатываем транзакцию, если он > 0, логируем ошибку, циклом с begin tran поднимает счетчик и сообщаем ВНЕШНЕЙ об ошибке?

ИМХО, раз переписали серверный код под новые фичи, то и клиента не мешало б подкурутить...

Сообщение было отредактировано: 13 июл 09, 12:02
13 июл 09, 12:02    [7407543]     Ответить | Цитировать Сообщить модератору
 Re: Здраствуй, елка, новый год?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
да, етсь такое, я поднимал такую же тему несколько месяцев назад.
Даже если это делается осознанно - не дают возможности надеяться на внешнюю транзакцию.
13 июл 09, 12:06    [7407571]     Ответить | Цитировать Сообщить модератору
 Re: Здраствуй, елка, новый год?  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
tpg
Ээээээ-ммм...
Может переписать так (хотя, криво канешна...): переписываем блок CATCH - фиксим в локальной переменной @@trancount, откатываем транзакцию, если он > 0, логируем ошибку, циклом с begin tran поднимает счетчик и сообщаем ВНЕШНЕЙ об ошибке?

ИМХО, раз переписали серверный код под новые фичи, то и клиента не мешало б подкурутить...

а что в этом кривого ?
вот примерный шаблон который я использую
BEGIN TRY
DECLARE		@Err	INT
DECLARE		@Tran	INT

SELECT	@Err = 0
SELECT	@Tran = @@TRANCOUNT
--------------------------------------------------------------------------------------------------------
IF @Tran = 0
	BEGIN TRANSACTION

INSERT ....

UPDATE ....

EXEC		@Err	=mayProc		
IF 		@Err 	!= 0	
		RAISERROR ('Error in mayProc ', 16, 1)
--------------------------------------------------------------------------------------------------------

IF @Tran = 0	
	IF	@Err = 0
	COMMIT TRANSACTION
	ELSE 
	ROLLBACK TRANSACTION
END TRY
BEGIN CATCH
IF @Tran = 0  AND @@TRANCOUNT>0
	ROLLBACK TRANSACTION


RAISERROR ('бла бла бла ',16,1)

END CATCH
RETURN	@Err
13 июл 09, 12:29    [7407715]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить