sqlserver事務與回滾
阿新 • • 發佈:2019-01-02
set XACT_ABORT ON---如果不設定該項為ON,在sql中預設為OFF,那麼只只回滾產生錯誤的 Transact-SQL 語句;設為ON,回滾整個事務begintran t1 ---啟動一個事務update[water].[dbo].[ErrorInf]set ErrorMessage='test'where ID=6insertinto[water].[dbo].[ErrorInf]([ID],ErrorMessage,[Description])
Values(1,'test1','test1')
committran t1 ---提交事務
insertinto dbo.area values('2222')
select1/0insertinto dbo.area values('333')
commit XACT_ABORT onbegintraninsertinto dbo.area values('1111')
insertinto dbo.area values('2222')
select1/0insertinto dbo.area values('333')
commit
if@@error>0 rollback
insertinto dbo.area values('2222')
if@@error>0 rollback
select1/0if@@error >0 rollback
insertinto dbo.area values('333')
if@@error>0 rollback
commit
BEGINTRANSACTIONinsertinto dbo.area values('1111')
insertinto dbo.area values('2222')
select1/0insertinto dbo.area values('333')
COMMITEND TRY
BEGIN CATCH
IF@@TRANCOUNT>0ROLLBACKDECLARE@ErrMsgnvarchar(4000), @ErrSeverityintSELECT@ErrMsg= ERROR_MESSAGE(),
@ErrSeverity= ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
事務回滾會使資料庫回覆到事務開始時的狀態
出現下述情況時,事務會回滾
1.手工用rollback tran回滾
2.設定了set xact_abort on後,出錯時會自動回滾
3.事務提交前,電腦出現故障,或者sql意外終止,事務會自動回滾
Values(1,'test1','test1')
committran t1 ---提交事務
功能:實現begin tran 和commit tran之間的語句,任一如果出現錯誤,所有都不執
事務不是有錯就回滾的,在不寫rollback的情況下,並不是什麼錯誤都會回滾事務,有時回滾當前語句,有時回滾整個事務
如例
begintraninsertinto dbo.area values('1111')insertinto dbo.area values('2222')
select1/0insertinto dbo.area values('333')
commit
像這樣,就算中間有錯,也不會回滾,結果會成功新增三條記錄
但有人說,比如重大錯誤,這事務也會所有回滾,只是我無法重現重大錯誤罷了
普通錯誤如果想回滾整個事務,只要加個set XACT_ABORT on就可以了
setinsertinto dbo.area values('2222')
select1/0insertinto dbo.area values('333')
commit
但也有人寫一堆@@error,如
begintraninsertinto dbo.area values('1111')if@@error>0 rollback
insertinto dbo.area values('2222')
if@@error>0 rollback
select1/0if@@error
insertinto dbo.area values('333')
if@@error>0 rollback
commit
當然也行,不過寫起來太麻煩了.
後來發現sql2005支援try
BEGIN TRYBEGINTRANSACTIONinsertinto dbo.area values('1111')
insertinto dbo.area values('2222')
select1/0insertinto dbo.area values('333')
COMMITEND TRY
BEGIN CATCH
IF@@TRANCOUNT>0ROLLBACKDECLARE@ErrMsgnvarchar(4000), @ErrSeverityintSELECT@ErrMsg= ERROR_MESSAGE(),
@ErrSeverity= ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
事務回滾會使資料庫回覆到事務開始時的狀態
出現下述情況時,事務會回滾
1.手工用rollback tran回滾
2.設定了set xact_abort on後,出錯時會自動回滾
3.事務提交前,電腦出現故障,或者sql意外終止,事務會自動回滾