sql-server – 如何从一个存储过程启动3个存储过程时回滚
副问题[/!--empirenews.page--]
我有一个存储进程,只在个中执行3个存储进程.假如主SP乐成,我只行使1个参数来存储. 假如第一个存储进程在主存储进程中正常事变,但第二个存储进程失败,那么它会自动回滚主SP中的全部SP照旧我必需做一些呼吁? 这是我的措施: CREATE PROCEDURE [dbo].[spSavesomename] -- Add the parameters for the stored procedure here @successful bit = null output AS BEGIN begin transaction createSavebillinginvoice begin Try -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; BEGIN EXEC [dbo].[spNewBilling1] END BEGIN EXEC [dbo].[spNewBilling2] END BEGIN EXEC [dbo].[spNewBilling3] END set @successful = 1 end Try begin Catch rollback transaction createSavesomename insert into dbo.tblErrorMessage(spName,errorMessage,systemDate) values ('spSavesomename',ERROR_MESSAGE(),getdate()) return end Catch commit transaction createSavesomename return END GO 办理要领仅给出题目中表现的代码,并假设三个子进程中没有一个具有任何显式事宜处理赏罚,则是,将捕捉三个子进程中的任何一此中的错误而且CATCH块中的ROLLBACK将转动返来全部的事变.可是这里有一些关于事宜的留意事项(至少在SQL Server中): >无论您几多次拨打BEGIN TRAN,都只有一次真正的买卖营业(第一次) >您可以定名一个事宜(就像您在此地方做的那样)而且该名称将呈此刻日记中,但定名仅对第一个/最外部事宜具故意义(由于同样,第一个事宜是事宜). >生涯点应承在事宜中建设可除掉的事变子集. >通过SAVE TRAN {save_point_name}呼吁建设/标志生涯点 >您无法提交特定的定名事宜.事宜“名称”(假如与COMMIT一路提供)将被忽略,仅出于可读性而存在. >第一个事宜,假设它被定名为: BEGIN TRAN A -- @@TRANCOUNT is now 1 -- DML Query 1 SAVE TRAN A -- DML Query 2 SAVE TRAN A -- DML Query 3 BEGIN TRAN B -- @@TRANCOUNT is now 2 SAVE TRAN B -- DML Query 4 此刻,假如您宣布(以下每个方案互相独立): > ROLLBACK TRAN B一次:它将除掉“DML Query 4”. @@ TRANCOUNT如故是2. >买卖营业名称和生涯点名称: >最多可包括32个字符 >存储进程自己不是隐式事宜.假如没有启动显式事宜,则每个查询都是隐式事宜.这就是为什么不必要环绕单个查询的显式事宜,除非也许有编程缘故起因来执行ROLLBACK,不然查询中的任何错误都是该查询的自动回滚. >在proc中启动BEGIN TRAN而不提交它,祈望在挪用/父历程中提交. 假如退出存储进程的事宜计数高于或低于它的注视时刻,则会呈现相同于以下内容的错误:
>表变量与通例变量一样,不受事宜束缚. 关于在proc中举办事宜处理赏罚,可以独立挪用(因此必要事宜处理赏罚)或从其他proc挪用(因此不必要事宜处理赏罚):这可以通过几种差异的方法完成. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |