Sql server 在SQLServer2005中回滚
我的问题:是否可以从SQLServer2005中的另一个存储过程回滚存储过程 我有SP1将值插入一个表,SP2将值插入另一个表。 因此,如果执行SP2时出现任何错误,我也要回滚SP1 请任何人帮我解决我的问题 谢谢,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
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为零
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:你不能这样做。