儲存過程和事務

2021-06-17 22:36:09 字數 2697 閱讀 2907

在儲存過程中使用事務時非常重要的,使用資料可以保持資料的關聯完整性,在sql server儲存過程中使用事務也很簡單,我們先來簡單了解一下儲存過程和事務,然後用乙個例子來簡單說明他們的用法:

儲存過程:

事務:

以學生註冊資訊為例:

create procedure [dbo].[proc_sturegister]     --設定引數

@cardno varchar(10),@stuno varchar(11),@cardtype varchar(8),@cardbalance decimal(18,1),@cardstate varchar(20),@registerdate varchar(20),@registertime varchar(20),@username varchar(20),

@ischeckout char(2),@stuname varchar(20),@*** varchar(2),@department varchar(20),@grade varchar(20),@stuclass varchar(20),@remark varchar(20),

@rechargedate varchar(20),@rechargetime varchar(20),@rrechargecash decimal(18,1)

asbegin

--事務

set nocount on;

set xact_abort on;

begin try

begin tran --開始乙個事務

--新增卡表

insert into t_cardinfo(cardno,stuno,cardtype,cardbalance ,cardstate ,registerdate ,registertime ,cardregistrator ,ischeckout ) values(@cardno,@stuno,@cardtype,@cardbalance ,@cardstate ,@registerdate ,@rechargetime ,@username ,@ischeckout )

--新增學生表

insert into t_stuinfo(stuno,stuname,***,department,grade,stuclass,remark ) values(@stuno,@stuname,@***,@department,@grade,@stuclass)

--新增充值表

insert into t_rechargerecord(cardno,rechargedate ,rechargetime ,rechargeoperator ,rechargecash ,ischeckout ) values(@cardno,@rechargedate ,@rechargetime ,@username ,@rrechargecash ,@ischeckout )

commit tran --提交事務

end try

begin catch

--在此不可以使用xact_state來判斷是否有不可提交的事務

--只可以使用@@trancount來判斷是否有還未提交的事務,未提交的事務未必

--就是不可提交的事務,所以使用@@trancount>0後就rollback是不準確的

if @@trancount>0

rollback tran; --回滾事務

end catch

end

說明:1 、使用儲存過程執行事物,需要開啟xact_abort引數(預設值為off),將該引數設定為on,表示當執行事務時,如果出錯,會將transcation設定為uncommittable狀態,那麼在語句塊批處理結束後將回滾所有操作;如果該引數設定為off,表示當執行事務時,如果出錯,出錯的語句將不會執行,其他正確的操作繼續執行。

2、當set nocount 為 on 時,不返回計數(計數表示受 transact-sql 語句影響的行數,例如在sql server查詢分析器中執行乙個delete操作後,下方視窗會提示(3)rows affected)。當   set nocount 為 off 時,返回計數,我們應該在儲存過程的頭部加上set nocount on 這樣的話,在退出儲存過程的時候加上 set nocount off這樣的話,以達到優化儲存過程的目的。

附: 1.捕獲錯誤的函式有很多,如下:

error_number() 返回錯誤號。

error_severity() 返回嚴重性。

error_state() 返回錯誤狀態號。

error_procedure() 返回出現錯誤的儲存過程或觸發器的名稱。

error_line() 返回導致錯誤的例程中的行號。

error_message() 返回錯誤訊息的完整文字。該文字可包括任何可替換引數所提供的值,如長度、物件名或時間。

2.   有些錯誤,如sql語句中的表名稱輸入錯誤,這是資料庫引擎無法解析這個表名稱時,所發生的錯誤在當前的try…catch語句中無法捕獲,必須由外層呼叫該儲存過程的地方使用try…catch來進行捕獲。

事務和儲存過程

事務 同生共死 指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 也就是由多個sql語句組成,必須作為乙個整體執行 這些sql語句作為乙個整體一起向系統提交,要麼都執行 要麼都不執行 語法步驟 開始事務 begin transaction 事務提交 commit transaction...

事務和儲存過程

create database moneychange gouse moneychange gocreate table bank id int primary key identity 1,1 name varchar 20 not null,money int default 0 check m...

sql事務和儲存過程

一 sql事務 1.什麼是事務 事務是乙個不可分割的工作邏輯單元,在資料庫系統上執行併發操作時事務是做為最小的控制單元來使用的。他包含的所有資料庫操作命令作為乙個整體一起向系提交或撤消,這一組資料庫操作命令要麼都執行,要麼都不執行。2.事務的語句 開始事物 begin transaction 提交事...