一勺抹茶

分享代码的乐趣

 

openrowset与触发器--分布式事务的问题

先看例子:
假设本地有表 a(a_nam varchar(5) ,a_add varchar(10),col int)
每次INSERT则忘另外一个服务器MINERVA下的MABEL插入表A同样的一笔数据

CREATE TRIGGER insert_trig1 ON [dbo].[a]
FOR INSERT
AS
set
insert into openrowset('SQLOLEDB','minerva' ; 'sa' ; '00' , mabel.dbo.a ) select * from inserted

insert into a values ('5','55',1)
/*
Server: Msg 7395, Level 16, State 2, Procedure insert_trig1, Line 6
無法啟動 OLE DB Provider 'SQLOLEDB' 的巢狀交易。由於 XACT_ABORT 選項已設定為 OFF,所以必須指定所要使用的巢狀交易。
[OLE/DB provider returned message: 在此工作階段中無法啟動更多的異動。
  ]
OLE DB 錯誤追蹤 [OLE/DB Provider 'SQLOLEDB' ITransactionLocal::StartTransaction returned 0x8004d013:  ISOLEVEL=4096]。
*/

修改:
alter TRIGGER insert_trig1 ON [dbo].[a]
FOR INSERT
AS
set
SET XACT_ABORT ON
insert into openrowset('SQLOLEDB','minerva' ; 'sa' ; '00' , mabel.dbo.a ) select * from inserted

insert into a values ('5','55',1)
/*
(1 row(s) affected)
*/
OK!

下面来简单说说分布式事务与触发器,事先步骤:
1.启动分布式事务MS DTC
2.在过程或者触发器设置SET XACT_ABORT ON

问题点:
SET XACT_ABORT是事务的必须吗
答:
否!
SET XACT_ABORT
指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。
语法
SET XACT_ABORT { ON | OFF }
注释
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。

对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。

SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。




posted on 2005-09-19 22:23  MoreTea  阅读(1894)  评论(1编辑  收藏  举报

导航