sqlserver 中複雜儲存過程回滾

2021-09-06 01:35:26 字數 4171 閱讀 1205

解決辦法一:

在begin transaction 前面加set xact_abort on

這樣就可以在過程出錯時中斷執行,當然也就不能commit了

如此再在最後乙個操作的後面加入 if @error=0 就說明所有的操作都執行成功了

就可以 commit

具體如:

set xact_abort on

begin trans

declare ...

<1>操作

<2>操作

...操作

if @error<>0

begin

rollback transaction

endelse

begin

commit transaction

endend

解決辦法二:

不加 set xact_abort on 而是宣告乙個記錄錯誤的變數

比如:begin trans

declare @nror int

set @nror=0

<1>操作

set @nror=@nror+@@error

<2>操作

set @nror=@nror+@@error

...操作

set @nror=@nror+@@error

if @ror<>0

begin

rollback transaction

endelse

begin

commit transaction

endend

顯然這樣在每乙個操作的背後都要加入乙個記錄錯誤的操作

最後再判斷錯誤是不是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

asbegin 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

endelse

begin

set @result='成功'

commit transaction

endgo

vc 中,ado執行sql server儲存過程

variant t recordsaffected string szsql string p ks adduser m szname m szpasswd trycatch com error e catch com error e 必須指定執行sql語句的commandtype是adcmdsto...

SQLServer 2005中列所有儲存過程方法

為了查詢這些儲存過程,你可以花時間在網際網路搜尋,檢視一些你還未知道的儲存過程,也許在一兩個小時您可能會發現你想要.也許你很幸運的找到,其他人在他們的文章中列出所有的儲存過程 函式和檢視,並介紹了如何使用這些儲存過程。但其實,您可以在一分鐘之內就可以自己列出這些儲存過程 函式和檢視的清單 這份名單甚...

在asp中呼叫sql server的儲存過程

在asp中呼叫sql server的儲存過程可以加快程式執行速度,所以這些天在研究asp中利用sql server的儲存過程,現總結如下,其中很多思想也是直接從chinaasp論壇中得出來,希望能給大家一些幫助。1.呼叫儲存過程的一般方法 先假設在sql server中有一儲存過程dt users ...