Sql server 在SQLServer2005中回滚

Sql server 在SQLServer2005中回滚,sql-server,rollback,Sql Server,Rollback,我的问题:是否可以从SQLServer2005中的另一个存储过程回滚存储过程 我有SP1将值插入一个表,SP2将值插入另一个表。 因此,如果执行SP2时出现任何错误,我也要回滚SP1 请任何人帮我解决我的问题 谢谢, Bharath您需要在一个事务中包装这两个调用 如果您用SQL调用它们,那么这就是方法,或者使用更全面的版本,就像7分钟前gbn回答的另一个答案一样 create proc doall as BEGIN TRY BEGIN TRAN EXECUTE SP1

我的问题:是否可以从SQLServer2005中的另一个存储过程回滚存储过程

我有SP1将值插入一个表,SP2将值插入另一个表。 因此,如果执行SP2时出现任何错误,我也要回滚SP1

请任何人帮我解决我的问题

谢谢,
Bharath

您需要在一个事务中包装这两个调用

如果您用SQL调用它们,那么这就是方法,或者使用更全面的版本,就像7分钟前gbn回答的另一个答案一样

create proc doall as
BEGIN TRY
     BEGIN TRAN
     EXECUTE SP1
     EXECUTE SP1
     COMMIT TRAN
END TRY

BEGIN CATCH
     ROLLBACK TRAN
END CATCH;
如果您是从其他来源调用SPs,例如从非SQL程序调用SPs,则需要使用Microsoft分布式事务协调器(MSDTC)服务设置外部事务

根据使用的API,您可以在代码中设置事务,然后根据条件在代码中提交和回滚

例如,在.net中,可以使用命名空间创建分布式事务

在主程序中

var tran = new System.Transactions.Transaction();

.
.
.

in one piece of code doe a db call (and pass the tran object to the sql connection) so it enlists in the transaction... if it fails - abort the transaction (trans.Rollback())

.
.
.
. 

in another piece of code do another db call (and pass the tran object to the sql connection) so it enlists in the transaction... if it fails - abort the transaction (trans.Rollback())
.
.
.
later...
if both pieces of code succeed commit the transaction 

如果您正在使用.net,这是对该名称空间的一个很好的介绍。您需要一个包装存储过程来管理事务

@@进入和退出存储过程时的TRANCOUNT必须相同,否则会出现错误266。因此,您不能在启动TXN后退出SP1

我假设SP1和SP2可以调用standalone,所以您需要一个嵌套事务。 然后你又犯了同样的错误,因为

  • BEGIN TRAN将一个添加到@TRANCOUNT
  • COMMIT TRAN从@TRANCOUNT中减去一
  • 回滚使@@TRANCOUNT为零
所以你仍然可以得到错误266

我在这里的回答解释了更多,包括嵌套、错误266抑制等:

所以在你的情况下,你需要这样的东西

CREATE PROCEDURE Wrapper
AS
SET XACT_ABORT, NOCOUNT ON

DECLARE @starttrancount int

BEGIN TRY
    SELECT @starttrancount = @@TRANCOUNT

    IF @starttrancount = 0
        BEGIN TRANSACTION

    EXEC SP1
    EXEC SP2

    IF @starttrancount = 0 
        COMMIT TRANSACTION
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO
创建过程包装器
作为
设置XACT_中止,不计数为ON
声明@starttrancount int
开始尝试
选择@starttrancount=@@TRANCOUNT
如果@starttrancount=0
开始交易
execsp1
执行SP2
如果@starttrancount=0
提交事务
结束尝试
开始捕捉
如果XACT_STATE()为0且@starttrancount=0
回滚事务
RAISERROR[使用@ErrorNumber、@ErrorMessage等重新显示捕获的错误]
端接
去

Hi preet,实际上我正在从另一个表单调用SP2,从另一个表单调用SP1。那么,如何才能调用公共SP。从中我必须调用公共SP。@Bharath:你不能这样做。