Sqlserver 事务嵌套(父存储过程 有事务 子存储过程也有事务)

SQLserver 专栏收录该内容
50 篇文章 1 订阅

俩个sqlserver 存储过程 父 子都要用事务

https://www.cnblogs.com/guanjie20/archive/2013/02/17/2914488.html 参考文献

做表插入 虽然 最后发现 其实不需要表嵌套  这俩个在逻辑上就不应该放在一起  

不过 还是发现了问题 所以 做一个记录

首先明白一个道理 就是 事务 如果只有父存储过程有  子存储过程 失败 是不会触发事务回滚的!

栗子

子存储过程

PROCEDURE [dbo].[ACTPRODUCTION_H_INSERT](@YMD nvarchar(8),
           @ITEMID nvarchar(3)
           ,@STEPID nvarchar(3)
       )
AS
BEGIN
 
  SET XACT_ABORT ON    
        BEGIN TRAN    
declare @SEQUNCE nvarchar(2),@DIFFLEVEL  nvarchar(1),@STANDARDS  int;


select @SEQUNCE=SEQUNCE,@DIFFLEVEL=DIFFLEVEL,@STANDARDS=STANDARDS from dbo.PROJECT where ITEMID =@ITEMID and STEPID=@STEPID;
INSERT INTO [HOSITORI_SYSTEM].[dbo].[ACTPRODUCTION_H]
           ([YMD]
           ,[ITEMID]
           ,[STEPID]
      
          )
     VALUES
           (@YMD
           ,@ITEMID
           ,@STEPID
   
          )
    IF @@error <> 0 
            BEGIN  
                ROLLBACK                                   
                RETURN 0;  
            END        
  
        COMMIT   
     SET XACT_ABORT OFF;   
     RETURN 1 ;     

父存储过程 存储信息  但是存储不了子存储过程 

USE [HOSITORI_SYSTEM]
GO
/****** Object:  StoredProcedure [dbo].[ACTPRODUCTION_INSERT]    Script Date: 10/29/2019 16:20:41 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Author,,Name
-- Create date: Create Date,,
-- Description:	Description,,
-- =============================================
ALTER PROCEDURE [dbo].[ACTPRODUCTION_INSERT] (@YMD nvarchar(8),
           @ITEMID nvarchar(3)
           ,@STEPID nvarchar(3)
           ,@STAFFID nvarchar(4)
           ,@LINEID nvarchar(1)
       )
AS
BEGIN
begin tran tran_AddInfo
declare @tran_error int;
 declare @result INT
set @tran_error=0;
begin try  
 INSERT INTO [HOSITORI_SYSTEM].[dbo].[ACTPRODUCTION]
           ([YMD]
           ,[ITEMID]
           ,[STEPID]
           ,[STAFFID]
           ,[LINEID]
         
           )
     VALUES
           (@YMD,
           @ITEMID 
           ,@STEPID 
           ,@STAFFID 
           ,@LINEID 
           ,@COUNT 
         )
           
  exec @result= ACTPRODUCTION_H_INSERT @YMD,@ITEMID ,@STEPID   
end try
begin catch
  if(Xact_state()=-1)
 begin
 rollback tran tran_AddInfo
 end
 INSERT INTO [dbo].[ERRLOG]
           ([ERRDATE]
           ,[ERRFORM]
           ,[ID]
           ,[ERRMSG])
     VALUES
           ('20191023'
           ,'22'
           ,1
           , '错误信息'+Error_message())
 
 end catch
if(@tran_error>0)
 begin
rollback tran tran_AddInfo
end
else
begin
commit tran tran_AddInfo;
end
END

这里应该有俩个问题 要么都用 try catch 要么都用 Xact_state() 

提供了一个思路 我相信 如果 都用try catch 俩个都能记录问题 

不行 子存储过程还能返回参数 可以通过 @result 来接受 子存储过信息

 

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值