指定当 Transact-SQL 语句产生运行时错误时,Microsoft? SQL Server? 是否自动回滚当前事务。分布式
SET XACT_ABORT { ON | OFF }spa
当 SET XACT_ABORT 为 ON 时,若是 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。orm
对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。惟一不须要该选项的状况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。blog
SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。事务
1.默认为SET XACT_ABORT OFF 即遇到错误时回滚(真是晕,这不叫回滚,遇到错误固然不能执行了)因此干脆说默认回滚不起做用。
2.SET XACT_ABORT OFF
。。。
COMMIT TRAN
这时才是所谓真正的事务,遇到任何错误事务回滚
3.SET XACT_ABORT OFF
。。。
这时遇到错误时事务回滚,错误前的操做正常
另@@IDENTITY 系统产销
==============================
理解 @@IDENTITY
@@IDENTITY 返回最后一个插入 IDENTITY 的值,这些操做包括:INSERT, SELECT INTO,或者 bulk copy。若是在给没有 IDENTITY 列的其余表插入记录,系统将其置为 null。若是有多行记录插入到 IDENTITY 表中,@@IDENTITY 表示最后一个产生的值。若是触发了某个触发器,而且这个触发器执行向另外一个带有 IDENTITY 列的表的插入操做,@@IDENTITY 将返回这个由触发器产生的值。若是这个触发器插入的表中不包含 IDENTITY 列,那么 @@IDENTITY 将为 null。若是插入操做失败,@@IDENTITY 值依然会增长,因此 IDENTITY 不保证数据的连续性。
get
1、各类用法及输出结果:it
一、语句1:编译
use demo
--Invoking a run-time error
SET XACT_ABORT OFF
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76)
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
goselect
结果1:只回滚错误行,语句还继续执行。语法
--select * from score
101 90
102 78
103 81
104 65
二、语句2:
use demo
--事务回滚
SET XACT_ABORT on
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76)
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
go
结果2:事务终止并所有回滚,结果为空。
--select * from score
三、语句3:
use demo
--事务在错误行终止,错误行回滚,错误行以前的不回滚
SET XACT_ABORT on
BEGIN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76)
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
END
go
结果3:出现这种是由于系统把每一个insert语句都当作是单独的事务,因此错误行之前的是不回滚的。
--select * from score
101 90
102 78