如果你也遇到了类似于
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,尽量简化
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,尽量简化