基本上方法有兩個:
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,將引數值賦給...