1. 程式人生 > >sqlserver事務與回滾

sqlserver事務與回滾

複製程式碼 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  ---提交事務 複製程式碼

功能:實現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就可以了

複製程式碼 set
 XACT_ABORT onbegintraninsertinto dbo.area values('1111')
insertinto 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
>0  rollback
insertinto dbo.area values('333')
if@@error>0  rollback
commit 複製程式碼

當然也行,不過寫起來太麻煩了.

後來發現sql2005支援try

複製程式碼 BEGIN TRY
   
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@ErrSeverity1)
END CATCH
複製程式碼 事務回滾會使資料庫回覆到事務開始時的狀態

出現下述情況時,事務會回滾
1.手工用rollback   tran回滾
2.設定了set   xact_abort   on後,出錯時會自動回滾
3.事務提交前,電腦出現故障,或者sql意外終止,事務會自動回滾