儲存過程中的事務實現 轉貼

2021-04-02 14:04:33 字數 2611 閱讀 8735

基本上方法有兩個:

set xact_abort

指定當 transact-sql 語句產生執行時錯誤時,microsoft® sql server™ 是否自動回滾當前事務。

語法set xact_abort 

注釋當 set xact_abort 為 on 時,如果 transact-sql 語句產生執行     時 錯誤,整個事務將終止並回滾。為 off 時,只回滾產生錯誤的 transact-sql 語句,而事務將繼續進行處理。編譯錯誤(如語法錯誤)不受 set xact_abort 的影響。

對於大多數 ole db 提供程式(包括 sql server),隱性或顯式事務中的資料修改語句必須將 xact_abort 設定為 on。唯一不需要該選項的情況是提供程式支援巢狀事務時。有關更多資訊,請參見分布式查詢和分布式事務。 

set xact_abort 的設定是在執行或執行時設定,而不是在分析時設定。

例:create proc testproc

asset xact_abort on

begin tran

insert into tablea (field1) values ('aa')

insert into tableb (field1) values ('bb')

commit tran

set xact_abort off

begin tran

/*要實現的操作*/

commit tran

if @@error>0

rollback

例:create proc testproc

asbegin tran

insert into tablea (field1) values ('aa')

insert into tableb (field1) values ('bb')

commit tran

if @@error>0

rollback

另外,在.net的ado.net資料庫程式設計中,可以使用sqltransaction實現事務操作。

例:public sub runsqltransaction()sub runsqltransaction(myconnstring as string)

dim myconnection as new sqlconnection(myconnstring)

myconnection.open()

dim mycommand as sqlcommand = myconnection.createcommand()

dim mytrans as sqltransaction

' start a local transaction

mytrans = myconnection.begintransaction()

' must assign both transaction object and connection

' to command object for a pending local transaction

mycommand.connection = myconnection

mycommand.transaction = mytrans

trymycommand.commandtext = "insert into region (regionid, regiondescription) values (100, 'description')"

mycommand.executenonquery()

mycommand.commandtext = "insert into region (regionid, regiondescription) values (101, 'description')"

mycommand.executenonquery()

mytrans.commit()

console.writeline("both records are written to database.")

catch e as exception

trymytrans.rollback()

catch ex as sqlexception

if not mytrans.connection is nothing then

console.writeline("an exception of type " & ex.gettype().tostring() & _

" was encountered while attempting to roll back the transaction.")

end if

end try

console.writeline("an exception of type " & e.gettype().tostring()   "was encountered while inserting the data.")

console.writeline("neither record was written to database.")

finally

myconnection.close()

end try

end sub 'runsqltransaction

[ 日期:2005-07-07 ]   [ 來自:weisai ]

在儲存過程中實現事務

在圖書館管理系統中系統管理員可以進行的操作有 借 還 新增 刪除 修改圖書或新增 刪除 修改讀者等,很多的操作都涉及到多個表的進行,我們一定要保持資料的一致性。如 刪除讀者 操作,會在讀者表 reader 中進行讀者的刪除,該讀者刪除後,借書表 reader book 也沒有必要再保留該讀者的借書記...

儲存過程中事務操作

資料庫中事務主要應用在多條語句的更新操作 插入 修改 刪除 可以保證資料的完整性與正確性。使用原則為盡可能少的影響資料,以免產生死鎖或者占用資源。在儲存過程中如果中間操作有非嚴重的錯誤資訊執行不會中斷,會繼續執行並返回相應結果。但是程式呼叫的話如果不是用 try catch形式則會報錯,出現黃頁。需...

在Mysql儲存過程中使用事務例項

create definer root localhost procedure createbusiness parameter1 int begin routine body goes here.declare flag int default parameter1 宣告變數flag,將引數值賦給...