2016-05-31 101 views
0

实际上,我对在存储过程中使用嵌套事务有点困惑。 我需要在一个主要程序中调用两个/三个程序。嵌套存储过程中的嵌套事务

如:

Begin try 

Begin Tran -- 1st level transcation 

Procedure 1 --will be executed 

Procedure 2 --will be executed 

End tran -- 1st level transcation 
End try 
Begin Catch 
Rollback tran 
End Catch 


PROCEDURE 1: 

BEGIN TRAN TRAN1 
///scripts 
COMMIT TRAN TRAN1 


PROCEDURE 2: 

BEGIN TRAN TRAN2 
///scripts 
COMMIT TRAN TRAN2 

我在做它在一个正确的方式?

+0

时PROC1或PROC2失败会发生什么? –

+0

无法回滚TRAN1。没有找到该名称的事务或保存点。 –

回答

0

提交内部事务被SQL Server数据库引擎忽略。根据在最外层事务结束时采取的操作,事务被提交或回滚。如果外部事务被提交,则内部嵌套事务也被提交。如果外部事务回滚,那么无论内部事务是否单独提交,所有内部事务也会回滚。

请参考链接 https://technet.microsoft.com/en-us/library/ms189336%28v=sql.105%29.aspx

0

有作为nested transactions没有这样的事情。如果你想回滚只是交易的一部分,那么我应该使用savepoints。关于保存点,如果COMMIT TRANSACTION SavepointName执行ROLLBACK后,这最后ROLLBACK语句将回滚everythint包括保存点定义部分:

BEGIN TRANSACTION -- A 

SAVE TRANSACTION SavePoint1 -- B 
-- do something 
COMMIT TRANSACTION SavePoint1 -- C 

-- ... 
-- This ROLLBACK will rollback everything including data committed for SavePoint1 - it will rollback also actions for [B,C] range 
ROLLBACK -- D 

如果我会用保存点,然后我会用下面从here模板(见Example)。

0

BEGIN TRANSACTION => @@ TRANCOUNT = @@ TRANCOUNT + 1
COMMIT TRANSACTION => @@ TRANCOUNT = @@ TRANCOUNT - 1(如果0节省的变化)
回滚事务=> @@ TRANCOUNT = 0(并放弃更改)

在你的外部过程只是做

BEGIN TRY 
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION 
    .. 
END TRY