Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не могу понять, что за ошибка с транзакцией. / 19 сообщений из 19, страница 1 из 1
19.08.2002, 20:16:49
    #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
20.08.2002, 10:38:44
    #32044442
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу понять, что за ошибка с транзакцией.
Где-то в коде ошибка. Вот и все, что известно на текущий момент
...
Рейтинг: 0 / 0
20.08.2002, 10:51:20
    #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
20.08.2002, 15:50:46
    #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
20.08.2002, 16:04:44
    #32044645
Александр Спелицин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу понять, что за ошибка с транзакцией.
Поменяйте порядок следования Raiserror и Rollback Transaction. Т.е. должно быть примерно так:

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

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

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

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

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

т.е. имя в ROLLBACK должно быть именем самой верхней транзакции и ничем другим. Как раз поэтому нет никакого смысла именовать транзакции. Вложенные транзакции в MSSQL - чисто декларативные.
...
Рейтинг: 0 / 0
22.08.2002, 11:37:39
    #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
22.08.2002, 11:42:04
    #32045130
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу понять, что за ошибка с транзакцией.
В огороде бузина, в Киеве - rommi. Твой пример совсем ни к месту, так как речь не идет о точках сохранения и откате к ним, а идет речь об откате транзакции. А вот в этом-то и должно быть соблюдено то самое требование BOL, которое я процитировал.
...
Рейтинг: 0 / 0
22.08.2002, 12:03:44
    #32045139
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу понять, что за ошибка с транзакцией.
В процедуре А я открываю транзакцию и в ней вызываю процедуру Б, в которой я тоже открываю транзакцию. Затем в процедуре Б я делаю откат транзакции и возвращаюсь в процедуру А, которая получив информацию что процедура Б не отработала до конца тоже в свою очередь делает откат своей транзакции.
Если я во всех этих процедурах уберу имя транзакции в ROLLBACK, этот будет работать правильно?
...
Рейтинг: 0 / 0
22.08.2002, 12:29:18
    #32045159
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу понять, что за ошибка с транзакцией.
Не будет, так как ROLLBACK откатывает все транзакции сразу и на следующем ROLLBACK выскочит ошибка, что попытка откатить неоткрытую транзакцию.
...
Рейтинг: 0 / 0
22.08.2002, 12:36:48
    #32045169
Underking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу понять, что за ошибка с транзакцией.
Жаль, придется наверно делать проверки на предмет наличия открытых транзакций.
Или как можно поступить, когда головная процедура должна иметь транзакцию, и вызываемая процедура тоже, ибо в другой ситуации она может быть вызвана сама по себе и являться головной.
...
Рейтинг: 0 / 0
22.08.2002, 13:06:03
    #32045189
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу понять, что за ошибка с транзакцией.
Ты прав придется наверно делать проверки
Но если у тебя всегда откатываются все транзакции по ROLLBACK, то можно проверку вынести в отделную просиду и вызывать её вместо ROLLBACK, если лень скопировать три строчки.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не могу понять, что за ошибка с транзакцией. / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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