SQL Server 分布式事务

如果你也遇到了类似于
OLE DB "SQLNCLI" "未知"  "分布"等错误时,请现尝试使用这个地址的方法进行处理,如果无效的话在继续后面的方法
http://blog.csdn.net/hb_gx/archive/2007/10/15/1826436.aspx

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连接的话,因为默认是自动提交,所以不用设置就可以

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

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

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

在调用的时候,还需要执行一个设置语句,否则还是不行
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,尽量简化

你可能感兴趣的:(SQL Server 分布式事务)