Sql 我可以打开两个不同名称的交易吗

Sql 我可以打开两个不同名称的交易吗,sql,sql-server,transactions,Sql,Sql Server,Transactions,我可以在下面这样的存储过程中有2个事务吗?如果我回滚TRAN1,它会回滚所有TRAN2吗?我在这里迷路了,任何反馈都会有所帮助。提前谢谢 BEGIN TRANSACTION TRAN1 WHILE(...) BEGIN BEGIN TRANSACTION TRAN2 BEGIN TRY ..... ..... ..... COMMIT TRANSACTION TRAN2

我可以在下面这样的存储过程中有2个事务吗?如果我回滚TRAN1,它会回滚所有TRAN2吗?我在这里迷路了,任何反馈都会有所帮助。提前谢谢

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

无论有多少事务,外部回滚都会回滚所有事务

当您嵌套事务(如本例中所述)时,每次提交/回滚都会增加或减少@@trancount

从MSDN

每个BEGIN TRANSACTION语句都将@TRANCOUNT递增一。每个提交事务或提交工作语句将@@TRANCOUNT递减1

使用一组嵌套事务中最外层事务的事务名称的回滚事务回滚所有嵌套事务,并将@TRANCOUNT递减为0

你也可以看到这一点:

下面是测试此行为的演示

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
参考文献:

您可能需要阅读以下内容: