本文鏈接:
https://blog.csdn.net/u011791378/article/details/835842401.XACT_ABORT
1)set XACT_ABORT off時,回滾產生錯誤的Transact-SQL語句,而事務將繼續(xù)進行處理,(注:錯誤嚴重或者語法錯誤時可能回滾整個事務)
2) set XACT_ABORT ON時,如果Transact-SQL語句產生運行時錯誤,整個事務將終止并回滾,
步驟1:
CREATE TABLE [dbo].[A](
[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[Name] [nvarchar](5) NULL,
[CreateDate] [datetime] NULL,
CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
--默認XACT_ABORT=off
SET XACT_ABORT off
begin tran
insert into [dbo].[A](Name,CreateDate) values('測試off',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測試off_異常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測試off',GETDATE());
commit tran
(1 行受影響)
消息 8152,級別 16,狀態(tài) 4,第 3 行
將截斷字符串或二進制數據。
語句已終止。
(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
注意:
事務的回滾對于擁有自增主鍵的表來說,insert的數據是被刪除,update和delete的數據是被恢復 。所以上面所顯示的ID=3 。
步驟2:
set XACT_ABORT ON
begin tran
insert into [dbo].[A](Name,CreateDate) values('測試on',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測試on_異常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測試on',GETDATE());
commit tran
同樣執(zhí)行select 查詢語句 得到如下結果
ID Name CreateDate
1 測試off
2018-10-31 15:06:09.330
3 測試off 2018-10-31 15:06:09.333
證明事務全部回滾成功。(注意下次新增數據的時候,ID的值。。。)
2.rollback
在sql中用事務的時候一般是這么寫。
declare @error int ;
begin tran
begin try
insert into [dbo].[A](Name,CreateDate) values('測試異常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測試異常_錯誤',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測試異常',GETDATE());
end try
begin catch
set @error=1
end catch
if @error>0
rollback tran
else
commit tran
注:
判斷事務回滾,則整個事務里面的sql語句一起回滾,跟SET XACT_ABORT ON相似,不同的是當事務進行嵌套時,如果用事務判斷的方法,嵌套的子事務不出錯,外面語句出錯,那么整個事務只會回滾外面出錯的語句,子事務提交成功了就回滾不了了,但是用SET XACT_ABORT ON,即使子事務提交成功,如果外圍事務出錯,子事務還是回滾.