问题描述
c#中,我建立一个连接,应该需要操作2个跨服务器数据库,查询,修改等动作,其中以下代码运行出错stringsqlca=''PersistSecurityInfo=True;InitialCatalog=yfasrs;UserID=sd;Password=admin;DataSource='166.110.1.2';SqlConnectionsqlcommon=newSqlConnection(sqlca);sqlcommon.Open();SqlTransactionotcommon=sqlcommon.BeginTransaction();try{stringsqlcommon4="updateOPENDATASOURCE('SQLOLEDB','DataSource=166.110.1.1;UserID=sd;Password=admin').yferp.dbo.INVLAsetLA025='R'whereLA016='e111'";}SqlCommandocom_stkmast3=newSqlCommand(sqlcommon3,sqlcommon);ocom_stkmast3.Transaction=otcommon;try{ocom_stkmast3.ExecuteNonQuery();}catch(SqlExceptiont){otcommon.Rollback();ocom_stkmast3.Dispose();sqlcommon.Dispose();sqlcommon.Close();}
我的数据库连接,和修改的表不是同一个服务器上的数据库,这样就出现了错误。无法执行该操作,因为链接服务器"(null)"的OLEDB访问接口"SQLNCLI10"无法启动分布式事务。链接服务器"(null)"的OLEDB访问接口"SQLNCLI10"返回了消息"该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。以上问题如何解决啊,我用一个数据库连接,完成其他数据库的操作,还要写在同一个事务中。
解决方案
本帖最后由 g505149841 于 2016-06-12 16:45:11 编辑
解决方案二:
你可以创建【链接服务器】,然后在进行其他的增删改查操作。比如你的机器地址是【166.110.1.100】,先创建两个链接服务器,分别链接【166.110.1.1】、【166.110.1.2】,然后你就可以写一个跨服的语句,比如:select*from[166.110.1.1].[数据库名字].[dbo].[table1]。依此类推。把你实现的功能写在一个语句中,然后执行该语句,将这个语句加入到一个事物当中就可以了,
解决方案三:
不能跨服务器,分布式事务时不靠谱的。你应该从“没有数据库事务”的前提下重新设计自己的程序的业务逻辑。另外,如果你设计一些符合最近3、4年互联网潮流的应用就会发现,去”数据库事务“是一个非常重要的设计能力。连单个数据库的事务操作都要去除,更何况你还要什么”分布式事务“?基本上,使用数据库事务都是为了图省事。然而这会在系统需要单机压力增大时带来巨大的性能代价,而在服务水平扩展时则完全需要扔掉了重写系统。
解决方案四:
具体地说,把你的otcommon 删除掉,不要考虑跨服务器的“事务”。你应该在业务逻辑上来保证事后确认业务操作,不要图省事只用数据库来保证。例如,如果有一笔支付资料进入淘宝的系统,它们后台可能要做30个不同子系统的不同操作,最后才确认这笔支付最终完成或者最终(或者提前)应该放弃。这个过程中人家不是纠结于“数据库事务”来设计软件的。如果纠结于数据库事务,那么淘宝网后台处理效率肯定降低300倍,而且还经常死锁、崩溃。对于高性能的大系统,其实“数据库事务编程”是个坑,而不是什么省事儿的编程方法。
解决方案五:
3楼在理!不要依赖数据库事务来保证数据一致性,至少不要在复杂业务中依赖数据库事务。
解决方案六:
引用3楼sp1234的回复:
具体地说,把你的otcommon 删除掉,不要考虑跨服务器的“事务”。你应该在业务逻辑上来保证事后确认业务操作,不要图省事只用数据库来保证。例如,如果有一笔支付资料进入淘宝的系统,它们后台可能要做30个不同子系统的不同操作,最后才确认这笔支付最终完成或者最终(或者提前)应该放弃。这个过程中人家不是纠结于“数据库事务”来设计软件的。如果纠结于数据库事务,那么淘宝网后台处理效率肯定降低300倍,而且还经常死锁、崩溃。对于高性能的大系统,其实“数据库事务编程”是个坑,而不是什么省事儿的编程方法。
对于并发性要求没那么高的系统,是不是事务挺好的?感觉你的说法,事务是不是主要用来图省事啊?通过业务逻辑设计都可以替代或者说实现比事务更好?
解决方案七:
解决方案八:
多个数据库服务器,一般处理方法是建立链接服务器,这样,操作两个数据库的数据,就像操作两个表一样了execsp_addlinkedserver'链接服务器名','','SQLOLEDB','远程服务器名或ip地址'execsp_addlinkedsrvlogin'链接服务器名'','false',null,'用户名','密码'
多个数据源,可以考虑Transactionscope,详情见:https://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscope(v=vs.80).aspx