程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server存儲進程中編寫事務處置的辦法小結

SQL Server存儲進程中編寫事務處置的辦法小結

編輯:MSSQL

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數據庫法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved