zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Python之协程
    Python之线程 3
    js和jsp之间相互传值
    毕业设计记录
    毕业设计记录16
    mysql select一张表的字段数据insert写入另一张表,同时传入自定义数据
    MySQL防止重复插入相同记录
    毕业设计记录
    解决python mysql插入int型数据报错:TypeError: %d format: a number is required, not str
    毕业设计记录
  • 原文地址:https://www.cnblogs.com/xiaofengfeng/p/1857118.html
Copyright © 2011-2022 走看看