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

Откуда:
Сообщений: 35
Здравствуйте!

Имеются две процедуры:
CREATE PROCEDURE [dbo].[Temp] 
AS
BEGIN

    BEGIN TRY
    	BEGIN TRANSACTION TEMP
    	
    	EXEC TEMP1
    	COMMIT TRANSACTION TEMP
    END TRY
    BEGIN CATCH
    	ROLLBACK TRANSACTION TEMP
    	RAISERROR('error',16,1)
    END CATCH
END

CREATE PROCEDURE [dbo].[Temp1] 
AS
BEGIN

    BEGIN TRY
    	BEGIN TRANSACTION TEMP1
    	
    	RAISERROR('error1',16,1)
    	COMMIT TRANSACTION TEMP1
    END TRY
    BEGIN CATCH
	SELECT @@TRANCOUNT
    	ROLLBACK TRANSACTION TEMP1
    	RAISERROR('error2',16,1)
    END CATCH
END


При вызове первой процедуры
EXEC TEMP
возникает ошибка.
Сообщение 50000, уровень 16, состояние 1, процедура sp_ThrowError, строка 21
Cannot roll back TEMP. No transaction or savepoint of that name was found.

@@TRANCOUNT = 2

Если вызвать сразу вторую процедуры, то выводится вызываемся ошибка 'error2'.

Как можно откатить две транзакции 'TEMP1','TEMP' и вызвать нужную ошибку 'error'?
31 авг 11, 10:10    [11204370]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
aleks2
Guest
1. Почитать всеж BOL.
2. В MS SQL нету вложенных транзакций.
3. Есть костыль.
31 авг 11, 10:12    [11204379]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1557
   END TRY
    BEGIN CATCH
	if @@TRANCOUNT > 0
    	    	ROLLBACK TRANSACTION TEMP1
    	RAISERROR('error2',16,1)
    END CATCH
31 авг 11, 11:15    [11204678]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
xact_state
Guest
YoriKim,

xact_state в вашей версии сервера присутствует?
31 авг 11, 11:25    [11204758]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
xact_state
Guest
aleks2
2. В MS SQL нету вложенных транзакций.

и давно?
31 авг 11, 11:30    [11204798]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
iljy
Member

Откуда:
Сообщений: 8711
xact_state
aleks2
2. В MS SQL нету вложенных транзакций.

и давно?

Всегда. Есть костыль - savepoint.
31 авг 11, 11:41    [11204874]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
локи блоки
Guest
iljy,

мы об одном и том же?

begin tran
exec proc
rollback tran

не откатит закомиченное внутри процы?
31 авг 11, 11:47    [11204923]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
YoriKim
Member

Откуда:
Сообщений: 35
Zelius,
@@TRANCOUNT возвращает 2, но тем не менее ошибка появляется

xact_state
YoriKim,
xact_state в вашей версии сервера присутствует?

Да, есть. MS sQL 2008.
31 авг 11, 11:49    [11204943]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
xact_state
Guest
YoriKim
xact_state
YoriKim,
xact_state в вашей версии сервера присутствует?

Да, есть. MS sQL 2008.


xact_state + F1 = гуд код
31 авг 11, 11:50    [11204956]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
iljy
Member

Откуда:
Сообщений: 8711
локи блоки
iljy,

мы об одном и том же?

begin tran
exec proc
rollback tran

не откатит закомиченное внутри процы?

Чей-то не откатит вдруг??? Всегда откатывается самая внешняя транзакция! Независимо от того, сколько раз было написано BEGIN TRAN
create table #ttt (id int)
begin tran tr1
insert #ttt values(1)
select * from #ttt
begin tran tr2
insert #ttt values(2)
select * from #ttt
commit tran tr2 -- Это можно убрать - поведение не изменится
rollback tran
select * from #ttt

drop table #ttt
31 авг 11, 11:52    [11204976]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
ло
Guest
iljy,

а что вы называете вложенными транзакциями которых нет?
nested transactions я по-другому переводить не умею. только как вложенные.
31 авг 11, 11:56    [11204998]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
iljy
Member

Откуда:
Сообщений: 8711
ло
iljy,

а что вы называете вложенными транзакциями которых нет?
nested transactions я по-другому переводить не умею. только как вложенные.

Полноценные вложенные транзакции - это когда откатывается самая вложенная на данный момент. В скуле такого нет, но есть точки сохранения, с помощью которых этот механизм можно симулировать.
31 авг 11, 11:59    [11205039]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
YoriKim
Member

Откуда:
Сообщений: 35
[quot xact_state]
xact_state()[quot]
Спасибо, заработало)

На всякий:

CREATE PROCEDURE [dbo].[Temp1] 
AS
BEGIN

    BEGIN TRY
    	BEGIN TRANSACTION TEMP1
    	
    	RAISERROR('error1',16,1)
    	COMMIT TRANSACTION TEMP1
    END TRY
    BEGIN CATCH
        IF (XACT_STATE()) = -1
	BEGIN
		ROLLBACK TRANSACTION TEMP1;
   	        RAISERROR('error2',16,1)
	END;
    END CATCH
END
31 авг 11, 12:02    [11205073]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
xact_state
Guest
YoriKim,

по-хорошему надо <>0 и обрабатывать оба варианта: и 1 и -1
31 авг 11, 12:06    [11205113]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция в транзакции  [new]
YoriKim
Member

Откуда:
Сообщений: 35
xact_state,
Исправил. Спасибо)
31 авг 11, 12:32    [11205253]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить