SQL Server存儲進程中編寫事務處置的辦法小結。本站提示廣大學習愛好者:(SQL Server存儲進程中編寫事務處置的辦法小結)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server存儲進程中編寫事務處置的辦法小結正文
本文實例講述了SQL Server存儲進程中編寫事務處置的辦法。分享給年夜家供年夜家參考,詳細以下:
SQL Server中數據庫事務處置是相當有效的,鑒於許多SQL初學者編寫的事務處置代碼存常常存在破綻,本文我們引見了三種分歧的辦法,舉例解釋了若何在存儲進程事務處置中編寫准確的代碼。願望可以或許對您有所贊助。
在編寫SQL Server 事務相干的存儲進程代碼時,常常看到上面如許的寫法:
begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran
如許編寫的SQL存在很年夜隱患。請看上面的例子:
create table demo(id int not null) go begin tran insert into demo values (null) insert into demo values (2) commit tran go
履行時會湧現一個違背not null 束縛的毛病信息,但隨後又提醒(1 row(s) affected)。 我們履行select * from demo 後發明insert into demo values(2) 卻履行勝利了。 這是甚麼緣由呢? 本來 SQL Server在產生runtime 毛病時,默許會rollback惹起毛病的語句,而持續履行後續語句。
若何防止如許的成績呢?有三種辦法:
1. 在事務語句最後面加上set xact_abort on
set xact_abort on begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran go
當xact_abort 選項為on 時,SQL Server在碰到毛病時會終止履行並rollback 全部事務。
2. 在每一個零丁的DML語句履行後,立刻斷定履行狀況,並做響應處置。
begin tran update statement 1 ... if @@error <> 0 begin rollback tran goto labend end delete statement 2 ... if @@error <> 0 begin rollback tran goto labend end commit tran labend: go
3. 在SQL Server 2005中,可應用 try...catch 異常處置機制。
begin tran begin try update statement 1 ... delete statement 2 ... endtry begin catch if @@trancount > 0 rollback tran end catch if @@trancount > 0 commit tran go
上面是個簡略的存儲進程,演示事務處置進程。
create procedure dbo.pr_tran_inproc as begin set nocount on begin tran update statement 1 ... if @@error <> 0 begin rollback tran return -1 end delete statement 2 ... if @@error <> 0 begin rollback tran return -1 end commit tran return 0 end go
願望本文所述對年夜家SQL Server數據庫法式設計有所贊助。