Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Yana1102 Member Откуда: Сообщений: 10 |
Помогите пожалуйста, уже давно бьюсь с этой проблемой :
в procedure открываю транзакцию (как обычно, begin transaction...), затем выполняются разные операции (только insert и select, без создавания таблиц и т.д.) Дальше при не выполнении определенного условия делаю rollback транзакции, а если условие не соблюдается - то commit. Знаю, что транзакция открывается - @@TRANCOUNT = 1, но когда дело доходит до отмены, или сохранения, то получаю ошибку, что транзакция с таким именем не найдена. В чем может быть проблема? Может кто-то сталкивался с такой пробелмой и может помочь? |
10 мар 04, 19:13 [571080] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Знаю, что транзакция открывается - @@TRANCOUNT = 1,
Если перед тем как вы хотите сделать коммит или роллбэк @@TRANCOUNT = 0, то это значит что транзакция уже завершена. Вами или сервером, целенаправленно или в результате возникшего исключения. |
10 мар 04, 19:19 [571094] Ответить | Цитировать Сообщить модератору |
Yana1102 Member Откуда: Сообщений: 10 |
Я выполняю rollback при условии, что @@TRANCOUNT <> 0, а сам rollback уже кричит... :( |
10 мар 04, 20:10 [571199] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Я выполняю rollback при условии, что @@TRANCOUNT <> 0,
Что-то я вам не верю - привидите скрипт моедлирующий вашу ситуацию |
10 мар 04, 20:12 [571201] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
баззззлайтер
Guest |
например, такая процедура воспроизводит вашу ошибку:
не пользоваться именованными транзакциями - вот наш ответ!
постыдились бы, в космический век... |
||||||||||||||
11 мар 04, 00:34 [571379] Ответить | Цитировать Сообщить модератору |
баззззлайтер
Guest |
например, такая процедура воспроизводит вашу ошибку:
не пользоваться именованными транзакциями - вот наш ответ!
постыдились бы, в космический век... |
||||||||||||||
11 мар 04, 00:35 [571381] Ответить | Цитировать Сообщить модератору |
баззззлайтер
Guest |
например, такая процедура воспроизводит вашу ошибку:
не пользоваться именованными транзакциями - вот наш ответ!
постыдились бы, в космический век... |
||||||||||||||
11 мар 04, 00:36 [571383] Ответить | Цитировать Сообщить модератору |
Yana1102 Member Откуда: Сообщений: 10 |
да это только для примера 3 процедуры, на самом деле их там штук 20, наверное. Но нету другого выхода, это обязательно должно быть в одной транзакции.
Спасибо!!!! Помогло! Видимо где-то была еще транзакция, которая мне и мешала. Но она была не именная, а эта - да, интересно, почему первая мешала второй? |
||||||||||||
11 мар 04, 08:30 [571551] Ответить | Цитировать Сообщить модератору |
Артем Member Откуда: Москва Сообщений: 335 |
Может все таки стоит поискать ту которая мешала ??
Выход с закрытием всех транзакций это конечно выход не споорю.. но наблюдается явная логическая брешь в проектировании и разработке по крайней мере серверной части приложения.. А то что больше трех процедур вызывается так эт никто не устанавливал сколько процедур должно быть вызвано из оддной транзакции.. Наоборот когда сложный обьект выгружает собственную структуру в базу данных процедуры сыплются одна за одной.. и только обьекту знать произошла ли грамотная его выгрузка или нет и стоит ли откатиться или можно и за коммитить всю ту байду которую от только что вывалил... ------------------------------------------------- все вышесказанное является моим IMHO, поэтому оспаривать возражения не буду.. ;) |
11 мар 04, 10:05 [571743] Ответить | Цитировать Сообщить модератору |
Алексей Ельцов Member Откуда: Redmond Сообщений: 252 |
Есть замечательный tool - Profiler - с которым можно определить где собака порылась за пару минут. Нужно трейсить конкретный SPID, откуда будет выполнен запрос, чтобы лишний мусор не сыпался, и к дефолтным events добавить SP:StmtStarted, и Transactions:SQLTransaction. Запустить, и найти где именно живет незванная Begin Tran. А почему мешало - не знаю. У меня не мешает, т.е. возможно что-то специфичное в твоем коде... Алексей |
||||||
11 мар 04, 23:43 [574018] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
Боровиков Степан 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Луше научитесь их готовить. Конешно, этот пример фуфло, но сами понимаете 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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8494 |
Боровиков Степан, то, что Вы хотите, называется "точка сохранения транзакции" SAVE TRANSACTION. Тот же мануал описывает поведение ROLLBACK. |
31 авг 15, 18:17 [18092575] Ответить | Цитировать Сообщить модератору |
МистерБеггинс
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 | ![]() |