电竞比分网-中国电竞赛事及体育赛事平台

分享

SQL事務(wù)回滾的兩種方式

 hdzgx 2019-12-09

1.XACT_ABORT

1)set XACT_ABORT off時,回滾產(chǎn)生錯誤的Transact-SQL語句,而事務(wù)將繼續(xù)進行處理,(注:錯誤嚴重或者語法錯誤時可能回滾整個事務(wù))

2) set XACT_ABORT ON時,如果Transact-SQL語句產(chǎn)生運行時錯誤,整個事務(wù)將終止并回滾,

步驟1:

  1. CREATE TABLE [dbo].[A](
  2. [ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
  3. [Name] [nvarchar](5) NULL,
  4. [CreateDate] [datetime] NULL,
  5. CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED
  6. (
  7. [ID] ASC
  8. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  9. ) ON [PRIMARY]
  10. GO
  11. --默認XACT_ABORT=off
  12. SET XACT_ABORT off
  13. begin tran
  14. insert into [dbo].[A](Name,CreateDate) values('測試off',GETDATE());
  15. insert into [dbo].[A](Name,CreateDate) values('測試off_異常',GETDATE());
  16. insert into [dbo].[A](Name,CreateDate) values('測試off',GETDATE());
  17. commit tran


(1 行受影響)
消息 8152,級別 16,狀態(tài) 4,第 3 行
將截斷字符串或二進制數(shù)據(jù)。
語句已終止。

(1 行受影響)

select * from [dbo].[A]
ID Name CreateDate
1          測試off

 2018-10-31 15:06:09.330

3 測試off 2018-10-31 15:06:09.333

 

注意:

事務(wù)的回滾對于擁有自增主鍵的表來說,insert的數(shù)據(jù)是被刪除,update和delete的數(shù)據(jù)是被恢復(fù)  。所以上面所顯示的ID=3 。

步驟2:

  1. set XACT_ABORT ON
  2. begin tran
  3. insert into [dbo].[A](Name,CreateDate) values('測試on',GETDATE());
  4. insert into [dbo].[A](Name,CreateDate) values('測試on_異常',GETDATE());
  5. insert into [dbo].[A](Name,CreateDate) values('測試on',GETDATE());
  6. commit tran

同樣執(zhí)行select 查詢語句  得到如下結(jié)果

ID Name CreateDate
1          測試off

 2018-10-31 15:06:09.330

3 測試off 2018-10-31 15:06:09.333

證明事務(wù)全部回滾成功。(注意下次新增數(shù)據(jù)的時候,ID的值。。。)

 

2.rollback

在sql中用事務(wù)的時候一般是這么寫。
 

  1. declare @error int ;
  2. begin tran
  3. begin try
  4. insert into [dbo].[A](Name,CreateDate) values('測試異常',GETDATE());
  5. insert into [dbo].[A](Name,CreateDate) values('測試異常_錯誤',GETDATE());
  6. insert into [dbo].[A](Name,CreateDate) values('測試異常',GETDATE());
  7. end try
  8. begin catch
  9. set @error=1
  10. end catch
  11. if @error>0
  12. rollback tran
  13. else
  14. commit tran

注:

判斷事務(wù)回滾,則整個事務(wù)里面的sql語句一起回滾,跟SET XACT_ABORT ON相似,不同的是當(dāng)事務(wù)進行嵌套時,如果用事務(wù)判斷的方法,嵌套的子事務(wù)不出錯,外面語句出錯,那么整個事務(wù)只會回滾外面出錯的語句,子事務(wù)提交成功了就回滾不了了,但是用SET XACT_ABORT ON,即使子事務(wù)提交成功,如果外圍事務(wù)出錯,子事務(wù)還是回滾.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多