公司有多台数据库服务器,因需要要对各数据库服务器之间进行访问,在现有的服务器a,建立一个链接服务器b,进行简单的数据访问.
select *from b.master.dbo.sysobjects --查询OK
接着在此查询中增加事务:
begin distributed tran
select *from b.master.dbo.sysobjects --查询OK
commit tran
提示: 服务器: 消息 7391,级别 16,状态 1,行 5
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 不能在指定的事务处理器中获得新事务。]
在网络上查询了半天,最后发现是MSDTC的问题,具体解决方法:
1、控制面板--管理工具--展开"组件服务"树,然后展开"我的电脑"。
2、右键单击"我的电脑",然后选择"属性",---在 MSDTC 选项卡中‘安全配置’按钮,确保选中了下列选项:网络 DTC 访问。网络事务 XA 事务 另外,"DTC 登录帐户"一定要设置为"NT Authority/NetworkService"。单击"确定",重新启动MSDTC。
再次进行运行以上查询,查询OK,无错误。
在a 服务器某表中TEST,建立触发器,触发器的执行内容是:将表TEST中的字段ID插入到另外服务器B的一个表中,但提示为:
服务器: 消息 7395,级别 16,状态 2,过程 tr_test,行 14
无法为 OLE DB 提供程序 'SQLOLEDB' 启动嵌套事务。之所以需要嵌套事务是因为 XACT_ABORT 选项已设置为 OFF。
[OLE/DB provider returned message: 无法在此会话中启动更多的事务。]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionLocal::StartTransaction returned 0x8004d013: ISOLEVEL=4096]。
发现是 XACT_ABORT 的问题,在触发器中增加以下语句 set XACT_ABORT on
具体是触发器代码是:
alter trigger tr_test
on TEST
for insert
AS
begin
set XACT_ABORT on
insert into WF.WorkflowEX.[dbo].test
select id from INSERTED
set XACT_ABORT off
end