• MS SQL SERVER 存储过程事务的实现方式


    MS SQL SERVER 存储过程事务的实现方式

    目前找到两种实现方式:

      1, 使用事务的存储过程使用特殊命名, 如UP_ProductAdd_Tran, 内部只需一对事务语句即可管理所有牵涉到业务的其他过程; 其他未使用此种方式命名的过程, 内部不能使用事务相关语句, 只需输出成功失败. 这种方式的好处是容易理解, 你只需要专心业务上的代码, 意外的时候返回错误, 在最外层直接回滚即可...缺点是你可能会产生很多_Tran命名的存储过程, 不好维护.

    UP_TestProcedure_Tran
    1
    2  CREATE PROCEDURE [dbo].[UP_TestProcedure_Tran]
    3 @ResultMessage nvarchar(255) output -- 输出信息
    4   -- 其他参数
    5  
    6 AS
    7 SET NOCOUNT OFF
    8 ---------------------------------------------------------------------------
    9   declare @CurrentError int;
    10 set @ResultMessage = 'OK';
    11
    12 -- 事务控制开始
    13   begin Tran
    14 ---------------------------------------------------------------------------
    15   exec @CurrentError = [UP_TestProcedure]
    16 @ResultMessage output -- 输出信息
    17   -- 其他参数
    18   ;
    19
    20 if(@CurrentError <> 0)
    21 begin
    22 set @CurrentError = 10;
    23 set @ResultMessage = '----------';
    24 goto TranLabel;
    25 end
    26
    27 ---------------------------------------------------------------------------
    28   -- 事务控制结束(提交或回滚)
    29   TranLabel:
    30 if(@CurrentError <> 0 and @@TRANCOUNT > 0)
    31 begin
    32 RollBack Tran;
    33 end
    34 if(@CurrentError = 0 and @@TRANCOUNT > 0)
    35 begin
    36 commit Tran;
    37 end
    38
    39 return @CurrentError;
    40
    41  

      2, 使用嵌套方式, 实现稍微麻烦, 接受一个事务计数变量, 以维护与调用者的同步, 完成时根据计数决定提交还是回滚, 代码如下:

    UP_TestTransaction
    1 CREATE PROCEDURE [dbo].[UP_TestTransaction]
    2 @LocalTranCount int output, -- 输出信息
    3   @ResultMessage nvarchar(255) output -- 输出信息
    4   -- 其他字段
    5   -- 其他字段
    6  AS
    7 -- declare @LocalTranCount int;
    8 -- set @LocalTranCount = 0;
    9 -- 将 @LocalTranCount 定义为输入输出参数
    10 -- 将 @LocalTranCount 定义为输入输出参数
    11 -- 当该存储过程被其他存储过程调用时
    12 -- 传入当前的事务计数
    13
    14 declare @ErrorCode int;
    15 set @ErrorCode = 0;
    16
    17 begin Transaction
    18 set @LocalTranCount = @LocalTranCount + 1;
    19
    20 begin Transaction
    21 set @LocalTranCount = @LocalTranCount + 1;
    22 insert into [tbCar] (
    23 CarCode,
    24 CarHongKongCode,
    25 NormalDriver,
    26 NormalDriverTel,
    27 BelongDepartmentId,
    28 BelongDepartment,
    29 CreateByUserId,
    30 CreateByUser
    31 ) values (
    32 '------',
    33 '5555555555',
    34 '6666666666',
    35 '77777777',
    36 0,
    37 'uuuuuuu',
    38 0,
    39 'bbbbbbb'
    40 )
    41
    42 begin
    43 set @ErrorCode = 10;
    44 set @ResultMessage = '---------';
    45 goto ErrorLabel;
    46 end
    47
    48 begin Transaction
    49 set @LocalTranCount = @LocalTranCount + 1;
    50 insert into [tbCar] (
    51 CarCode,
    52 CarHongKongCode,
    53 NormalDriver,
    54 NormalDriverTel,
    55 BelongDepartmentId,
    56 BelongDepartment,
    57 CreateByUserId,
    58 CreateByUser
    59 ) values (
    60 '--4353---',
    61 '5555555555',
    62 '6666666666',
    63 '77777777',
    64 0,
    65 'uuuuuuu',
    66 0,
    67 'bbbbbbb'
    68 )
    69
    70 begin
    71 set @ErrorCode = 20;
    72 set @ResultMessage = '---------';
    73 goto ErrorLabel;
    74 end
    75 commit Transaction
    76 commit Transaction
    77
    78
    79 ErrorLabel:
    80 IF(@@TranCount = @LocalTranCount)
    81 RollBack Transaction;
    82 Else
    83 Commit Transaction;
    84
    85 return @ErrorCode;

    参考资料:

    http://www.cnblogs.com/montaque/archive/2005/03/12/117410.html 第一页评论

    虽然只有几个字, 但是写的时候还是感觉到文字不行..好像说不清楚 ~!@#$%^&*

  • 相关阅读:
    Oracle 基础系列之1.3 用户管理
    Oracle 系统常用命令
    Gogs安装
    centos7 Minimal安装没有ifconfig
    centos 上安装nodejs v8.0.0
    Linux 学习笔记
    使用 weinre 远程调试移动端页面
    Linux tree命令
    innodb分区
    Innodb表空间
  • 原文地址:https://www.cnblogs.com/chenbg2001/p/2405041.html
Copyright © 2020-2023  润新知