sql 互操作数据库

--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有事务机制,错误要回滚事务并停止往下执行,但是不在事务内已经执行的语句还是被成功执行。其实很好理解,和其他地方处理事务一样,把一个事务当成一个语句就好了,错了就回滚并终止执行,是所谓精准终止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值