zoukankan      html  css  js  c++  java
  • 多个存储过程之间相互调用的原子性问题

    每个存储过程如果涉及到2个以上的数据更新操作,通常我们会采用 TRANSCTION 来做事务性操作。但一旦遇到存储过程之间的调用时,举个例子:A存储过程调用B存储过程。会遇到A存储过程的事务不受B存储过程事务影响的问题,通常很多人的做法是检查B存储过程的ReturnValue,如果返回值不为0,则代表出错,存储过程A执行相应的操作。
    应该采用下面的方法:

     DECLARE @ErrorCode     int
        SET @ErrorCode = 0

        DECLARE @TranStarted   bit
        SET @TranStarted = 0

        IF( @@TRANCOUNT = 0 )
        BEGIN
         BEGIN TRANSACTION
         SET @TranStarted = 1
        END
        ELSE
         SET @TranStarted = 0
     

    -- 需要考虑原子性的存储过程语句写在这里

    -- 先检查 UserSectionProfile中是否已经存在该用户的信息记录
     IF EXISTS(SELECT UserName FROM UserSectionProfiles WHERE UserName = @UserName AND SectionID = @SectionID)
     BEGIN
      -- 更新UserSectionProfile
      UPDATE UserSectionProfile
      SET
       SectionCardXml = @SectionCardXml,
       LastUpdatedDate = @CurrentTime
      WHERE
       UserName = @UserName AND
       SectionID = @SectionID
     END
     ELSE -- 否则创建UserSectionProfile
     BEGIN
     -- 写入UserSectionProfile
     INSERT INTO UserSectionProfiles(UserName,SectionID,SectionCardXml, CreatedDate,LastUpdatedDate)
     VALUES(@UserName,@SectionID,@SectionCardXml,@CurrentTime,@CurrentTime)
     
     END

        IF( @@ERROR <> 0 )
        BEGIN
            SET @ErrorCode = -1
            GOTO Cleanup
        END

        IF( @TranStarted = 1 )
        BEGIN
         SET @TranStarted = 0
         COMMIT TRANSACTION
        END
       
     RETURN 0
     
    Cleanup:

        IF( @TranStarted = 1 )
        BEGIN
            SET @TranStarted = 0
         ROLLBACK TRANSACTION
        END

        RETURN @ErrorCode

  • 相关阅读:
    mysql ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: YES)
    mysql修改root密码和设置权限
    Navicat Premium 12破解版激活
    获取/设置光标位置
    Go开发工程师
    npm包大全
    war3辅助代码及运行方式
    6.页面绘制-帖子列表页和前端路由
    5.页面绘制-主题列表页(使用ColorUI、uni-app官方组件)
    4.页面绘制-脚本页面和个人中心页面
  • 原文地址:https://www.cnblogs.com/csharpsharper/p/554087.html
Copyright © 2011-2022 走看看