powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не могу понять, что за ошибка с транзакцией.
19 сообщений из 19, страница 1 из 1
Не могу понять, что за ошибка с транзакцией.
    #32044371
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В хранимой процедуре открывается транзакция, из нее запускаются другие хранимые процедуры. Если запускаемая ХП вернула ошибочный результат, происходит откат транзакции и выход из ХП. Но откат почему-то не происходит. Перед ROLLBACK TRANSACTION и после, функция @@trancount показывает одно и то же количество открытых транзакций. Естественно в результате остаются открытые транзакции и клиента клинет.
Программа выдает следующий набор ошибок. В чем может быть проблема?

Server: Msg 6401, Level 16, State 1, Procedure JournalServiceNewService, Line 81
Cannot roll back TRA_SERV_NEW. No transaction or savepoint of that name was found.
Server: Msg 266, Level 16, State 1, Procedure JournalServiceNewService, Line 87
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 2.
Server: Msg 266, Level 16, State 1, Procedure ManAllocate, Line 65535
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 2.
Server: Msg 266, Level 16, State 1, Procedure ManRegistrate, Line 208
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32044442
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в коде ошибка. Вот и все, что известно на текущий момент
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32044446
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё же написано
Cannot roll back TRA_SERV_NEW. No transaction or savepoint of that name was found.
Если в процедуре стоит
ROLLBACK TRA_SERV_NEW
то где-то перед ней должно быть
BEGIN TRAN TRA_SERV_NEW
Что в данном случае не выполняется по причине наверно кривизны кода.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32044635
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сам бы сказал, что код где-то кривой, но вот он код. Или я чего-то не понимаю.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
 CREATE PROCEDURE JournalServiceNewService
	@UIDConsumer int = NULL,
	@UIDPayer int = NULL,
	@UIDService int = NULL,
	@Quantity float = NULL,
	@Lag int = NULL,
	@Discount float = NULL,
	@Caption varchar( 255 ) = NULL,
	@Charge bit = NULL,
	@Taxrate money  = NULL,
	@UIDOperation int = NULL,
	@UIDJournalService int = NULL OUTPUT,
	@UIDSub01 int = NULL,
	@UIDSub02 int = NULL,
	@UIDSub03 int = NULL,
	@UIDSub04 int = NULL,
	@UIDSub05 int = NULL,
	@UIDSub06 int = NULL,
	@UIDSub07 int = NULL,
	@UIDSub08 int = NULL,
	@UIDSub09 int = NULL,
	@UIDSub10 int = NULL

AS

	DECLARE @Summ money
	DECLARE @FSumm money

	BEGIN TRANSACTION  TRA_SERV_NEW

	EXEC JournalServiceInsert @UIDConsumer, NULL, @UIDService, @Quantity, @Lag, NULL, @Discount, @Caption,  1 , @Taxrate, @UIDJournalService OUT
	IF (@UIDJournalService IS NULL) BEGIN
		RAISERROR ('Ошибка добавления записи в таблицу услуг', 16 , 1 )
		ROLLBACK TRANSACTION TRA_SERV_NEW
		RETURN
	END

	EXEC JournalServiceCharge @UIDJournalService, @UIDPayer,  1 , @Discount, @Summ OUT, @UIDSub01, @UIDSub02, @UIDSub03, @UIDSub04, @UIDSub05, @UIDSub06, @UIDSub07, @UIDSub08, @UIDSub09, @UIDSub10
	IF (@Summ IS NULL) BEGIN
		RAISERROR ('Ошибка проводки', 16 , 1 )
		ROLLBACK TRANSACTION TRA_SERV_NEW

 -- Менно этот роллбэк не срабатывает.
 

		RETURN
	END

	IF ((@UIDOperation IS NOT NULL) and (@UIDOperation<> 0 )) BEGIN
		IF NOT EXISTS (SELECT UID FROM list_operation WHERE UID=@UIDOperation) BEGIN
			RAISERROR ('Операция задана неверно', 16 , 1 )
			ROLLBACK TRANSACTION TRA_SERV_NEW
			RETURN
		END

		EXEC JournalServicePay @UIDJournalService, @UIDOperation,  1 , @FSumm OUT
		IF (@FSumm IS NULL) BEGIN
			RAISERROR ('Ошибка оплаты', 16 , 1 )
			ROLLBACK TRANSACTION TRA_SERV_NEW
			RETURN
		END
	END

	COMMIT TRANSACTION TRA_SERV_NEW
GO

...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32044645
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поменяйте порядок следования Raiserror и Rollback Transaction. Т.е. должно быть примерно так:

IF (bla-bla-bla) BEGIN
ROLLBACK TRANSACTION TRA_SERV_NEW
RAISERROR ('Бла-бла-бла...',16,1)
RETURN
END
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32044991
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Поменяйте порядок следования Raiserror и Rollback Transaction
Нет, я уже неоднократно убеждался что от порядка следования не зависет.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32044999
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EXEC JournalServiceCharge @UIDJournalService, @UIDPayer, 1, @Discount, @Summ OUT, @UIDSub01, @UIDSub02, @UIDSub03, @UIDSub04, @UIDSub05, @UIDSub06, @UIDSub07, @UIDSub08, @UIDSub09, @UIDSub10

-- Менно этот роллбэк не срабатывает.

Можа в JournalServiceCharge какой глюк?
Типа там транзакция начинается и при ошибке не откатытавается?
@@TRANCOUNT проанализируй ...
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045000
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наименование транзакции придется убрать. Это только для точки сохранения работает.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045002
Vasiliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может во внутренних процедурах есть вложенные транзакции и там происходит неименованный откат который автоматический откатывает и внешнюю транзакцию, если нет то пусть меня поправят
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045036
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по поводу наименований транзакций. Чем отличаются именованные и неименовынные транзакции?
Чем это черевато?
У меня все транзакции проименованы. Я уже двадцать раз проверил, имена есть везде и ошибки в именах не обнаружил.

PS: Я заступорелся с этими транзакциями, уже не знаю что делать. Вообщем все эти процедуры достаточно большие, в той же JournalServiceCharge 600 строк.
Может есть какие рекомендации по правильной организации транзакций.
У меня есть вложенные транзакции, и избавиться от этого не нарушая логики программы нельзя.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045041
rommi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй всем открываемым в вызываемых процедурах транзакциям дать разные имена.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045087
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Попробуй всем открываемым в вызываемых процедурах транзакциям дать разные имена.

У меня для каждой транзакции свое имя.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045115
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это требование BOL вы учли?
When nesting transactions, transaction_name must be the name from the outermost BEGIN TRANSACTION statement.

т.е. имя в ROLLBACK должно быть именем самой верхней транзакции и ничем другим. Как раз поэтому нет никакого смысла именовать транзакции. Вложенные транзакции в MSSQL - чисто декларативные.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045126
rommi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Create procedure MyProc1
as
begin tran MyTran1
select @@version
exec MyProc2
commit tran MyTran1
GO



Create procedure MyProc2

as
begin tran MyTran2
save tran MyTran2
select @@version
rollback tran MyTran2
commit tran MyTran2
GO

exec MyProc1
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045130
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В огороде бузина, в Киеве - rommi. Твой пример совсем ни к месту, так как речь не идет о точках сохранения и откате к ним, а идет речь об откате транзакции. А вот в этом-то и должно быть соблюдено то самое требование BOL, которое я процитировал.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045139
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В процедуре А я открываю транзакцию и в ней вызываю процедуру Б, в которой я тоже открываю транзакцию. Затем в процедуре Б я делаю откат транзакции и возвращаюсь в процедуру А, которая получив информацию что процедура Б не отработала до конца тоже в свою очередь делает откат своей транзакции.
Если я во всех этих процедурах уберу имя транзакции в ROLLBACK, этот будет работать правильно?
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045159
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не будет, так как ROLLBACK откатывает все транзакции сразу и на следующем ROLLBACK выскочит ошибка, что попытка откатить неоткрытую транзакцию.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045169
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль, придется наверно делать проверки на предмет наличия открытых транзакций.
Или как можно поступить, когда головная процедура должна иметь транзакцию, и вызываемая процедура тоже, ибо в другой ситуации она может быть вызвана сама по себе и являться головной.
...
Рейтинг: 0 / 0
Не могу понять, что за ошибка с транзакцией.
    #32045189
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты прав придется наверно делать проверки
Но если у тебя всегда откатываются все транзакции по ROLLBACK, то можно проверку вынести в отделную просиду и вызывать её вместо ROLLBACK, если лень скопировать три строчки.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не могу понять, что за ошибка с транзакцией.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]