1.XACT_ABORT
1)set XACT_ABORT off時(shí),回滾產(chǎn)生錯(cuò)誤的Transact-SQL語句,而事務(wù)將繼續(xù)進(jìn)行處理,(注:錯(cuò)誤嚴(yán)重或者語法錯(cuò)誤時(shí)可能回滾整個(gè)事務(wù))
2) set XACT_ABORT ON時(shí),如果Transact-SQL語句產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,整個(gè)事務(wù)將終止并回滾,
步驟1:
[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[Name] [nvarchar](5) NULL,
[CreateDate] [datetime] NULL,
CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
insert into [dbo].[A](Name,CreateDate) values('測(cè)試off',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測(cè)試off_異常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測(cè)試off',GETDATE());
(1 行受影響)
消息 8152,級(jí)別 16,狀態(tài) 4,第 3 行
將截?cái)嘧址蚨M(jìn)制數(shù)據(jù)。
語句已終止。
(1 行受影響)
select * from [dbo].[A]
ID |
Name |
CreateDate |
1 |
測(cè)試off |
2018-10-31 15:06:09.330
|
3 |
測(cè)試off |
2018-10-31 15:06:09.333 |
注意:
事務(wù)的回滾對(duì)于擁有自增主鍵的表來說,insert的數(shù)據(jù)是被刪除,update和delete的數(shù)據(jù)是被恢復(fù) 。所以上面所顯示的ID=3 。
步驟2:
insert into [dbo].[A](Name,CreateDate) values('測(cè)試on',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測(cè)試on_異常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測(cè)試on',GETDATE());
同樣執(zhí)行select 查詢語句 得到如下結(jié)果
ID |
Name |
CreateDate |
1 |
測(cè)試off |
2018-10-31 15:06:09.330
|
3 |
測(cè)試off |
2018-10-31 15:06:09.333 |
證明事務(wù)全部回滾成功。(注意下次新增數(shù)據(jù)的時(shí)候,ID的值。。。)
2.rollback
在sql中用事務(wù)的時(shí)候一般是這么寫。
insert into [dbo].[A](Name,CreateDate) values('測(cè)試異常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測(cè)試異常_錯(cuò)誤',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('測(cè)試異常',GETDATE());
注:
判斷事務(wù)回滾,則整個(gè)事務(wù)里面的sql語句一起回滾,跟SET XACT_ABORT ON相似,不同的是當(dāng)事務(wù)進(jìn)行嵌套時(shí),如果用事務(wù)判斷的方法,嵌套的子事務(wù)不出錯(cuò),外面語句出錯(cuò),那么整個(gè)事務(wù)只會(huì)回滾外面出錯(cuò)的語句,子事務(wù)提交成功了就回滾不了了,但是用SET XACT_ABORT ON,即使子事務(wù)提交成功,如果外圍事務(wù)出錯(cuò),子事務(wù)還是回滾.