• sqlserver 中复杂存储过程回滚


    解决办法一:
           在begin transaction 前面加set xact_abort on
           这样就可以在过程出错时中断执行,当然也就不能commit了
           如此再在最后一个操作的后面加入 if @error=0 就说明所有的操作都执行成功了
           就可以 commit
           具体如:
               set xact_abort on
               begin trans
               declare ...
               <1>操作
               <2>操作
               ...
               <n>操作
               if @error<>0
                  begin
                    rollback transaction
                  end
               else
                  begin
                    commit transaction
                  end
               end
     解决办法二:
           不加 set xact_abort on 而是声明一个记录错误的变量
              比如:
               begin trans
               declare @nror int
               set @nror=0
               <1>操作
               set @nror=@nror+@@error
               <2>操作
               set @nror=@nror+@@error
               ...
               <n>操作
               set @nror=@nror+@@error
               if @ror<>0
                  begin
                    rollback transaction
                  end
               else
                  begin
                    commit transaction
                  end
               end
           显然这样在每一个操作的背后都要加入一个记录错误的操作
           最后再判断错误是不是0,如果不是则说明过程中某一步出了错,就不commit了。
           这比第一种方法在烦一点,
    
    
    
    
    
    
    
    
    CREATE PROCEDURE order_down_forjoin2
    
    @result varchar(50)  output,
    @orderno varchar(50),
    @out_trade_no varchar(50),
    @product_class varchar(50),
    @brand varchar(50),
    @product_no varchar(30),
    @product_size varchar(50),
    @color varchar(100),
    @color2 varchar(100),
    @number int,
    @price money,
    @area varchar(50),
    @city varchar(50),
    @county varchar(50),
    @address varchar(200),
    @zip varchar(20),
    @username varchar(50),
    @phone varchar(50),
    @mobile varchar(50),
    @email varchar(100),
    @joinno varchar(50),
    @isems int,
    @ems money,
    @send varchar(400),
    @memo text,
    @sendinfo1 varchar(50),
    @sendinfo1time datetime,
    @sendinfo varchar(50),
    
    /*库存的更新*/
    @number55 int,
    @number2 int,
    @number3 int,
    @number4 int,
    @number5 int,
    
    /*库存记录的插入*/
    @number222 int,
    @stock varchar(50),
    @operation_type varchar(50),
    @operation varchar(50),
    @memo_product_inout_record text,
    @users varchar(50),
    
    /*备用金的更新*/
    @checks varchar(16),
    @lastprice money,
    @memo_protect_log text,
    
    @server varchar(50),
    @disprice_class varchar(50),
    @disprice money,
    @price2 money
    
    
     AS
    begin TRANSACTION
               declare @nror int
               set @nror=0        
    
    insert into tbl_order 
    (orderno,out_trade_no,product_class,brand,product_no,product_size,color,color2,price,area,city,county,server,address,zip,username,phone,email,memo,joinno,isems,ems,send,sendinfo1,sendinfo1time,sendinfo,mobile,disprice,disprice_class)
    values
    (@orderno,@out_trade_no,@product_class,@brand,@product_no,@product_size,@color,@color2,@price,@area,@city,@county,@server,
    @address,@zip,@username,@phone,@email,@memo,@joinno,@isems,@ems,@send,@sendinfo1,@sendinfo1time,@sendinfo,@mobile,@disprice,@disprice_class)       
      set @nror=@nror+@@error
    
    update tbl_product_store  set  number=number-@number55,number2=number2-@number2,number3=number3-@number3,number4=number4-@number4,number5=number5-@number5  
    where product_no=@product_no and color=@color and product_size=@product_size     
      set @nror=@nror+@@error
    
    insert into tbl_product_inout_record
    (product_no,color,product_size,number2,stock,users,operation_type,operation,memo)
     values (@product_no,@color,@product_size,0-
    @number,@stock,@users,@operation_type,@operation,@memo_product_inout_record)    
      set @nror=@nror+@@error
    
    update tbl_protect set price=@lastprice ,checks=@checks    where joinno=@joinno
     set @nror=@nror+@@error
    
    insert into tbl_protect_log (joinno,orderno,price,product_no,memo) values (@joinno,@orderno,0-@price2,@product_no+'-'+@color+'-'+@product_size,@memo_protect_log)
     set @nror=@nror+@@error
    
    
               if @nror<>0
             
                  begin
      set @result='失败'
                    rollback transaction
                  end
               else
            
                  begin
      set @result='成功'
                    commit transaction
                  end
    GO
    
  • 相关阅读:
    Oracle学习笔记:oracle的表空间管理和sqlserver的文件组对比
    Oracle学习笔记:一个特殊的ORA12541错误原因
    Oracle学习笔记:通过种子数据库设置dbid为指定值
    Oracle学习笔记:使用rman duplicate {to|for} 创建数据库
    Oracle学习笔记:利用rman数据库备份,手工创建clone数据库
    使用Cufon技术实现Web自定义字体
    分享七个非常有用的Android开发工具和工具包
    60佳灵感来自大自然的网页设计作品欣赏
    20个独一无二的图片滑动效果创意欣赏
    40个幻灯片效果在网页设计中的应用案例
  • 原文地址:https://www.cnblogs.com/xiaofengfeng/p/1857118.html
Copyright © 2020-2023  润新知