MSDTC 分布式事务处理记录

来源:互联网 发布:eos remote mac下载 编辑:程序博客网 时间:2024/04/29 23:32

        公司有多台数据库服务器,因需要要对各数据库服务器之间进行访问,在现有的服务器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