2016-09-28 2 views
1

Могу ли я иметь 2 транзакции в хранимой процедуре, как показано ниже? Если я откатываю TRAN1, откатывает ли он все TRAN2? Я потерян здесь, любая обратная связь поможет. Заранее спасибоМогу ли я открыть 2 транзакции с разными именами

BEGIN TRANSACTION TRAN1 

WHILE(...) 
BEGIN 

    BEGIN TRANSACTION TRAN2 

    BEGIN TRY 
      ..... 
      ..... 
      ..... 
      COMMIT TRANSACTION TRAN2   
    END TRY 
    BEGIN CATCH 
      ROLLBACK TRANSACTION TRAN2 
    END CATCH 
END 

COMMIT TRANSACTION TRAN1 
+1

Возможно, вы захотите прочитать следующее: https://technet.microsoft.com/en-us/library/ms189336(v=sql.105).aspx – Nebi

ответ

3

Независимо от того, сколько сделок у вас есть, Outer откатить откатов все сделки ..

Когда вы вкладываете сделки, как в вашем случае, каждый поручаем/откат увеличивается или уменьшается @@ TRANCOUNT ..

Из MSDN ..

Каждый НАЧАТЬ приращений TRANSACTION выписки @@ TRANCOUNT один. Каждое заявление COMMIT TRANSACTION или COMMIT WORK уменьшает значение @@ TRANCOUNT на единицу.

ROLLBACK TRANSACTION, который использует имя транзакции из внешней транзакции в наборе вложенных транзакций выполняется откат всех вложенных транзакций и декрементах @@ TRANCOUNT до 0

Смотрите это так: A SQL Server DBA myth a day: (26/30) nested transactions are real

Ниже демо, чтобы проверить это поведение ..

if object_id('t1','u') is not null 
drop table t1 

create table t1 
(
id int 
) 

go 

begin tran outertran 

select @@trancount--1 
insert into t1 
select 1 

begin tran innertran 

select @@trancount--2 

insert into t1 
select 2 



/**below throws error,since you can reference only outer transaction 
-referrring inner tran is not legal 
***/ 
--rollback tran innertran 

/*** 
error you get by uncommneting above 
Msg 6401, Level 16, State 1, Line 20 
Cannot roll back innertran. No transaction or savepoint of that name was found. 
**/ 

commit tran innertran 
select @@trancount--1 

rollback --rollbacks all 

select * from t1 

Ссылки:
http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/