--drop trigger mytri_insert_author
create trigger mytri_insert_author on dbo.student for insert
as
set xact_abort on
--set identity_insert student ON
insert DBTest.dbo.student(stud_name) (select EN from NameMap where CN=(select stud_name from inserted))
--set identity_insert student OFF
go
USE [test01]
GO
exec sp_addlinkedserver 'DBTest','','SQLOLEDB','LAPTOP-T0K6HA81'
exec sp_addlinkedsrvlogin 'DBTest','false',null,'sa','1'
USE [DBTest]
GO
exec sp_addlinkedserver 'test01','','SQLOLEDB','LAPTOP-T0K6HA81'
exec sp_addlinkedsrvlogin 'test01','false',null,'sa','1'
USE [DBTest]
GO
--drop trigger my_tri_update_NameMap
create trigger my_tri_update_NameMap on student for insert
as
set xact_abort on
update test01.dbo.NameMap set havesynchronous=1 where EN=(select EN from inserted)
go
insert into [test01].[dbo].[student]([stud_name]) values('测试');
[sql] view plain copy
SET XACT_ABORT OFF
GO
INSERT INTO a(a) VALUES(1)
INSERT INTO a(a) VALUES(2)
INSERT INTO a(a) VALUES(3)
INSERT INTO a(a) VALUES(3)
INSERT INTO a(a) VALUES(4)
INSERT INTO a(a) VALUES(5)
GO
执行返回:
[sql] view plain copy
(1 行受影响)
(1 行受影响)
(1 行受影响)
消息 2627,级别 14,状态 1,第 4 行
违反了 PRIMARY KEY 约束 'pk_a'。不能在对象 'dbo.a' 中插入重复键。
语句已终止。
(1 行受影响)
(1 行受影响)
结果:
[sql] view plain copy
1
2
3
4
5
很明显,虽然第四个INSERT处报错了,但是语句还是继续往下执行,直至结束。
2、XACT_ABORT=OFF、有事务
[sql] view plain copy
SET XACT_ABORT OFF
GO
INSERT INTO a(a) VALUES(1)
BEGIN TRAN
INSERT INTO a(a) VALUES(2)
INSERT INTO a(a) VALUES(3)
INSERT INTO a(a) VALUES(3)
INSERT INTO a(a) VALUES(4)
COMMIT TRAN
INSERT INTO a(a) VALUES(5)
GO
返回和结果与1一样,说明报错了以后,只回滚错误语句,同时继续往下执行,直至结束。
XACT_ABORT=OFF没有事务机制,错误就回滚错误语句本身,继续往下一句一句执行,直至结束。
3、XACT_ABORT=ON、无事务
[sql] view plain copy
SET XACT_ABORT ON
GO
INSERT INTO a(a) VALUES(1)
INSERT INTO a(a) VALUES(2)
INSERT INTO a(a) VALUES(3)
INSERT INTO a(a) VALUES(3)
INSERT INTO a(a) VALUES(4)
INSERT INTO a(a) VALUES(5)
GO
执行返回:
[sql] view plain copy
(1 行受影响)
(1 行受影响)
(1 行受影响)
消息 2627,级别 14,状态 1,第 5 行
违反了 PRIMARY KEY 约束 'pk_a'。不能在对象 'dbo.a' 中插入重复键。
结果为:
[sql] view plain copy
1
2
3
很明显,虽然也在第四个INSERT出报错了,但是和1的区别是语句停止了执行,下面插入4和5的语句没有被执行。
4、XACT_ABORT=ON、有事务
[sql] view plain copy
SET XACT_ABORT ON
GO
INSERT INTO a(a) VALUES(1)
BEGIN TRAN
INSERT INTO a(a) VALUES(2)
INSERT INTO a(a) VALUES(3)
INSERT INTO a(a) VALUES(3)
INSERT INTO a(a) VALUES(4)
COMMIT TRAN
INSERT INTO a(a) VALUES(5)
GO
执行返回:
[sql] view plain copy
(1 行受影响)
(1 行受影响)
(1 行受影响)
消息 2627,级别 14,状态 1,第 5 行
违反了 PRIMARY KEY 约束 'pk_a'。不能在对象 'dbo.a' 中插入重复键。
结果为:
[sql] view plain copy
1
很明显,虽然也在第四个INSERT出报错了,语句停止了执行,但是和3的区别事务内的前两句插入2和3的语句被回滚了,只有不在事务内的插入1的成功了。
XACT_ABORT=ON有事务机制,错误要回滚事务并停止往下执行,但是不在事务内已经执行的语句还是被成功执行。其实很好理解,和其他地方处理事务一样,把一个事务当成一个语句就好了,错了就回滚并终止执行,是所谓精准终止。