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

Откуда:
Сообщений: 10
Помогите пожалуйста, уже давно бьюсь с этой проблемой :
в procedure открываю транзакцию (как обычно, begin transaction...),
затем выполняются разные операции (только insert и select, без создавания таблиц и т.д.)
Дальше при не выполнении определенного условия делаю rollback транзакции, а если условие не соблюдается - то commit.
Знаю, что транзакция открывается - @@TRANCOUNT = 1, но когда дело доходит до отмены, или сохранения, то получаю ошибку, что транзакция с таким именем не найдена. В чем может быть проблема? Может кто-то сталкивался с такой пробелмой и может помочь?
10 мар 04, 19:13    [571080]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Знаю, что транзакция открывается - @@TRANCOUNT = 1,

Если перед тем как вы хотите сделать коммит или роллбэк @@TRANCOUNT = 0, то это значит что транзакция уже завершена. Вами или сервером, целенаправленно или в результате возникшего исключения.
10 мар 04, 19:19    [571094]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Yana1102
Member

Откуда:
Сообщений: 10
Я выполняю rollback при условии, что @@TRANCOUNT <> 0, а сам rollback уже кричит... :(
10 мар 04, 20:10    [571199]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Я выполняю rollback при условии, что @@TRANCOUNT <> 0,

Что-то я вам не верю - привидите скрипт моедлирующий вашу ситуацию
10 мар 04, 20:12    [571201]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Yana1102
Member

Откуда:
Сообщений: 10
Begin transaction yyy
declare @Error INT
EXEC proc1 @Error OUT
select * from table
EXEC proc2 @Error OUT
EXEC proc3 @Error OUT

IF @Error >0 and @@TRANCOUNT>0
BEGIN
SELECT @Error as Error
SELECT @@TRANCOUNT as TRANCOUNT
ROLLBACK transaction yyy
END
ELSE
COMMIT transaction yyy

Я специально вывела распечатку ошибки и @@TRANCOUNT, чтобы видеть, с какими параметрами я захожу в блок.
Внутри процедур есть только команды select, insert, нет никаких других транзакций.

Вот сообщение:
"ERROR
-----------
222

(1 row(s) affected)

TRANCOUNT
-----------
2

(1 row(s) affected)

Server: Msg 6401, Level 16, State 1, Procedure MAG, Line 431
Cannot roll back yyy. No transaction or savepoint of that name was found."
10 мар 04, 20:20    [571204]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Aquarius
Member

Откуда:
Сообщений: 469
...a chto proishodit v procedurah ? Voobshe na moi vzglyad eto ozhen' ploho kogda iz transakcii vyzyvayutsya azh tri(!) procedury. Malo li chto v nih proishodit. ;)
10 мар 04, 22:28    [571300]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
ayam
Member

Откуда: SPb
Сообщений: 133
Вход в процедуру уже в транзакции, т.е. @@TRANCOUNT > 0
лучше использовать
DECLARE @Tran int SET @Tran = @@TRANCOUNT
IF @Tran = 0 BEGIN TRAN [можно именованую, но зачем?]
...
IF @Tran = 0
BEGIN
IF @Err = 0 COMMIT TRAN []
ELSE ROLLBACK TRAN []
END
или
DECLARE @Tran int SET @Tran = @@TRANCOUNT
IF @Tran = 0 BEGIN TRAN Имя
ELSE SAVE TRAN Имя
...
IF @Err <> 0 ROLLBACK TRAN Имя
ELSE IF @Tran = 0 COMMIT TRAN Имя
10 мар 04, 23:54    [571352]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
баззззлайтер
Guest
например, такая процедура воспроизводит вашу ошибку:

alter procedure proc3 @Error int out as

begin
WHILE(@@TRANCOUNT>0)
COMMIT TRANSACTION
BEGIN TRAN
BEGIN TRAN
Select @Error = 222
end


не пользоваться именованными транзакциями - вот наш ответ!

Aquarius
...tri(!) procedury

...достигает 8(!) байт

постыдились бы, в космический век...
11 мар 04, 00:34    [571379]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
баззззлайтер
Guest
например, такая процедура воспроизводит вашу ошибку:

alter procedure proc3 @Error int out as

begin
WHILE(@@TRANCOUNT>0)
COMMIT TRANSACTION
BEGIN TRAN
BEGIN TRAN
Select @Error = 222
end


не пользоваться именованными транзакциями - вот наш ответ!

Aquarius
...tri(!) procedury

...достигает 8(!) байт

постыдились бы, в космический век...
11 мар 04, 00:35    [571381]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
баззззлайтер
Guest
например, такая процедура воспроизводит вашу ошибку:

alter procedure proc3 @Error int out as

begin
WHILE(@@TRANCOUNT>0)
COMMIT TRANSACTION
BEGIN TRAN
BEGIN TRAN
Select @Error = 222
end


не пользоваться именованными транзакциями - вот наш ответ!

Aquarius
...tri(!) procedury

...достигает 8(!) байт

постыдились бы, в космический век...
11 мар 04, 00:36    [571383]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Yana1102
Member

Откуда:
Сообщений: 10
Aquarius
Voobshe na moi vzglyad eto ozhen' ploho kogda iz transakcii vyzyvayutsya azh tri(!) procedury. Malo li chto v nih proishodit. ;)


да это только для примера 3 процедуры, на самом деле их там штук 20, наверное. Но нету другого выхода, это обязательно должно быть в одной транзакции.

баззззлайтер
WHILE(@@TRANCOUNT>0)
COMMIT TRANSACTION
BEGIN TRAN

Спасибо!!!! Помогло! Видимо где-то была еще транзакция, которая мне и мешала. Но она была не именная, а эта - да, интересно, почему первая мешала второй?
11 мар 04, 08:30    [571551]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Артем
Member

Откуда: Москва
Сообщений: 335
Может все таки стоит поискать ту которая мешала ??
Выход с закрытием всех транзакций это конечно выход не споорю.. но наблюдается явная логическая брешь в проектировании и разработке по крайней мере серверной части приложения..

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

-------------------------------------------------
все вышесказанное является моим IMHO, поэтому оспаривать возражения не буду.. ;)
11 мар 04, 10:05    [571743]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Алексей Ельцов
Member

Откуда: Redmond
Сообщений: 252
автор
Спасибо!!!! Помогло! Видимо где-то была еще транзакция, которая мне и мешала. Но она была не именная, а эта - да, интересно, почему первая мешала второй?


Есть замечательный tool - Profiler - с которым можно определить где собака порылась за пару минут.

Нужно трейсить конкретный SPID, откуда будет выполнен запрос, чтобы лишний мусор не сыпался, и к дефолтным events добавить SP:StmtStarted, и Transactions:SQLTransaction. Запустить, и найти где именно живет незванная Begin Tran.

А почему мешало - не знаю. У меня не мешает, т.е. возможно что-то специфичное в твоем коде...

Алексей
11 мар 04, 23:43    [574018]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Транзакции - не находит начало!  [new]
Боровиков Степан
Member

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

begin tran t1
insert into t_error (p_date,p_name,p_type) values (getdate(), 'первая транзакция', 1)
begin tran t2
insert into t_error (p_date,p_name,p_type) values (getdate(), 'вторая транзакция', 1)
rollback tran t2
commit tran t1

вызывает ошибку:

Msg 6401, Level 16, State 1, Line 8
Cannot roll back t2. No transaction or savepoint of that name was found.

получается что rollback tran t2 откатывает обе транзакции.

Может я что то не понимаю. Помогите разобраться. Спасибо.
28 авг 15, 20:41    [18083572]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
o-o
Guest
A SQL Server DBA myth a day: (26/30) nested transactions are real

Myth #26: nested transactions are real in SQL Server.

FALSE!!!

,,,
The commit of a nested transaction has absolutely no effect – as the only transaction that really exists as far as SQL Server is concerned is the outer one. Can you say 'uncontrolled transaction log growth'? Nested transactions are a common cause of transaction log growth problems because the developer thinks that all the work is being done in the inner transactions so there's no problem.

The rollback of a nested transaction rolls back the entire set of transactions – as there is no such thing as a nested transaction.

Your developers should not use nested transactions. They are evil.
,,,
28 авг 15, 20:46    [18083603]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
aleks2
Guest
o-o
Your developers should not use nested transactions. They are evil.


Луше научитесь их готовить.

Конешно, этот пример фуфло, но сами понимаете
begin tran t1
insert into t_error (p_date,p_name,p_type) values (getdate(), 'первая транзакция', 1)
if @@trancount = 0 begin tran t2 else save tran t2
insert into t_error (p_date,p_name,p_type) values (getdate(), 'вторая транзакция', 1) 
rollback tran t2
commit tran t1


В сложной системе - сложно избежать вложенных транзакций.
31 авг 15, 09:19    [18089634]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
Боровиков Степан,

то, что Вы хотите, называется "точка сохранения транзакции" SAVE TRANSACTION.

Тот же мануал описывает поведение ROLLBACK.
31 авг 15, 18:17    [18092575]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции - не находит начало!  [new]
МистерБеггинс
Guest
http://geekswithblogs.net/bbiales/archive/2012/03/15/how-to-nest-transactions-nicely---quotbegin-transactionquot-vs-quotsave.aspx
31 авг 15, 23:09    [18093385]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить