MEMO-Procedure Transaction: SQL Server vs Oracle

同事詢問關於Procedure內是否會自動包成Transaction的問題,我的認知是SQL要額外下SET XACT_ABORT ON,但Oracle則預設會自動包成Transaction。記憶有些模糊,所以索性做個實驗最準。

分別在SQL, Oracle寫了Procedure,先塞入兩筆資料,第三筆故意產生PK重覆錯誤,觀察資料庫是否有前兩筆資料來判別是否有Transaction保護。實驗證明,原先的認知沒錯,二者行為不同。

SQL Server Procedure要將操作包成Transaction的話,記得要下SET XACT_ABORT ON!

/*** SQL Server Test ***/
--建立有PK的Table
create table jefftable (
    id decimal, 
    constraint pk_jefftable primary key (id)
)
--建立SP, 故意塞入重覆PK
create procedure jeffproc
as 
begin
   /* SQL SP要自成Transaction, 要加這列
    set xact_abort on
   */
   insert into jefftable values (1)
   insert into jefftable values (2)
   insert into jefftable values (1)
end
--執行SP, 會產生錯誤
exec jeffproc
--查Table會看到兩筆
select * from jefftable
--清理實驗廢棄物
drop table jefftable
drop procedure jeffproc
 
/*** ORACLE Test ***/
--建立有PK的Table
create table jefftable (
  id decimal, 
  constraint pk_jefftable primary key (id)
)
--建立SP, 故意塞入重覆PK
create procedure jeffproc
is
begin
  insert into jefftable values (1);
  insert into jefftable values (2);
  insert into jefftable values (1);
end;
--執行SP, 會產生錯誤
declare
begin
jeffproc;
end;
--查Table, 沒有資料
select * from jefftable
--清理實驗廢棄物
drop table jefftable
drop procedure jeffproc
Published 06 November 2009 12:13 PM 由 Jeffrey


意見

# 小熊 said on 21 December, 2009 01:17 AM

謝謝您的分享... ^^

在學習這段語法的過程中,

因為

  /* SQL SP要自成Transaction, 要加這列

      set xact_abort on

  */

中間的set xact_abort on沒有變成和註解一樣的綠色,

一開始還弄不太清楚,

小小建議一下也許可以考慮用"--"來標示... ^_^||

# Jeffrey said on 21 December, 2009 03:10 AM

to 小熊,CSharpFormatter在處理註解標色時不是100%精準,我想下回會格外留意,並謝謝你的指正!

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 

請輸入以上的數字:

搜尋

Go

<November 2009>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345
 
RSS
【工商服務】

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication