我想从另一个SP拨打SP。我知道我可以轻易称之为。但问题是,如果在SP2中发生错误,那么我想要ROLLBACK SP1。
SP1页 BEGIN Tran
[部分准则]
致电SP2
[部分代码]
SP2
BEGIN TRAN
[部分准则]
[错误来了]
ROLLBACK TRAN
这将仅在sp2中回滚Tran。如果在sp2中发生错误,我也想要RollBack SP1。
任何帮助都将不胜感激。
答案 0 :(得分:4)
在SP2中尝试RAISERROR
。
答案 1 :(得分:2)
似乎人们对其他信息网站有疑问......
它的要点是父程序在尝试执行孩子已经拥有的ROLLBACK时将通过异常。解决这个问题的方法是让父母在提交之前检查@trancount。
http://forums.asp.net/t/1259708.aspx
Create procedure [dbo].[parent] as Begin Transaction Begin Try
Exec Child End Try Begin Catch
If @@Trancount > 0
RollBack End Catch Commit
Create procedure [dbo].[Child] as Begin Transaction Begin Try
--Do inserts here End Try Begin Catch
If @@Trancount > 0
RollBack
RAISERROR('Error Occured',16,1) End Catch Commit
答案 2 :(得分:1)
一种可能性是使用@ErrorCode INT OUTPUT参数创建SP2,该参数指示调用者是否需要回滚或提交。
答案 3 :(得分:1)
您可以使用类似的错误代码(我不会编写代码,如果我是你,我该怎么做)
SP1
DECLARE ReturnVal
BEGIN TRAN
CODE
CALL SP1 ReturnVal output
IF ReturnVal=errorvalue
ROLLBACK TRAN
SP2
DECLARE ReturnVal output
BEGIN TRAN
CODE
ERROR
SET ReturnVal=errorVal
ROLLBACK
RETURN ReturnVal
答案 4 :(得分:1)
听起来你不需要嵌套的交易。尝试使用try blocks(psuedocode)控制提交/回滚:
begin try
begin trans
do stuff
call other sp
do more stuff
commit trans
end try
begin catch
rollback trans
do something here to report failure to app
end catch
如果try块中的任何地方发生错误,包括使用另一个sp,则控件将传递给catch块并回滚事务。
答案 5 :(得分:0)
在第二个SP中创建一个输出参数,其类型为bit,表示发生了错误。基于此,您可以回滚SP 1。