2007年10月31日 星期三

SQL Begin Transaction

在SQL語法裡,為了保證我們所寫的一段SQL語法裡都是正確,常常會使用 begin transaction / commit 來完成。範例如下:

begin tran;

update TFather set FName='111' where FID=1;


delete TFather where FID=1; --(故意會出錯的一行指令)

update TFather set FName='222' where FID=2;


if (@@ERROR<>0)
rollback tran;
else
commit tran;


我們通常會希望如果上面三行SQL指令有錯,自動RollBack 所有資料。然而,實際情況並非如此。他只會RollBack中間那行指令。第一、第三行指令都會被執行且修改到資料庫裡。這問題的解法,是要執行一行指令於 begin tran 之前:

SET XACT_ABORT ON

完整程式如下:

SET XACT_ABORT ON


begin tran;

update TFather set FName='111' where FID=1;


delete TFather where FID=1;

update TFather set FName='222' where FID=2;


if (@@ERROR<>0)
rollback tran;
else
commit tran;

沒有留言:

張貼留言