如果你也遇到了类似于
OLE DB "SQLNCLI" "未知" "分布"等错误时,请现尝试使用这个地址的方法进行处理,如果无效的话在继续后面的方法

SQL Server数据库以下简称MSS

MSS服务器demo1 创建表

create table1(col1 varchar(20),col2 varchar(20) col3 varchar(20))
 insert into ('1','','')
 insert into ('1','','')
 insert into ('2','','')
 insert into ('2','','')

MSS服务器demo2 创建远程连接到demo1,并创建视图

create view table
 as
 select * from dblink_demo1.master.dbo.table1 where col1='1'

在查询分析器中

update table set col3 = col3; --ok,执行成功
begin trans T
     update table set col3 = col3; --error,执行失败
 commit trans T

这个问题产生的原因是,你的视图table用到了远程数据库上的表,造成你的事务T需要,成为一个分布式事务。所以你需要配置分布式事务环境,就如同文章开始的引用文章中所说得那样,配置msdtc

此时,需要声明分布式事务

begin DISTRIBUTED trans T
     update table set col3 = col3; --error,执行还是失败
 commit trans T

至此,我也很是苦恼,找了很多方法,服务器也进行了升级,最后还是没配通,于是乎就把代码改了

powerbuilder中,autocommit设置为true就可以了
如果是用ado连接的话,因为默认是自动提交,所以不用设置就可以

当然了这样设置也存在一个问题,就是事务无法回滚,还要自己进行后续的错误处理

通过以上方法尽管已经能够更新数据,但是因为无法进行事务的回滚,显然存在一定的风险

于是下午又进行了一些实验,发现是防火墙的问题,关闭之后就可以测通了。但是作为数据库服务起来说,不开通防火墙显然是风险更大,那么怎么设置,请看这篇文章

在调用的时候,还需要执行一个设置语句,否则还是不行

EXECUTE IMMEDIATE  "set xact_abort on"
begin transaction t
 update table set col2 = col2;
 commit transaction t

总结
1.配置msdtc
2.配置防火墙
3.检查视图,更新语句,尽量少关联表
4.增加"set xact_abort on"

常见错误
1.msdtc没有启动 net start msdtc

2.分布式事务无法启动 ,配置msdtc,保证选中“入站”“出战”“TIP 事务”

3.超时,设置msdtc,选项,事务超时为0或者大一些

4.无法启动分布式事务,防火墙问题,关闭防火墙

5.NULL事务,通常为视图,或者更新语句较复杂,造成loopback,尽量简化