C#中跨数据库增删改的事务控制

g505149841 2016-06-12 04:44:20
c# 中,我建立一个连接,应该需要操作2个跨服务器数据库,查询,修改等动作,其中以下代码运行出错
 
string sqlca=''Persist Security Info=True;Initial Catalog=yfasrs;User ID=sd;Password=admin;Data Source='166.110.1.2';
SqlConnection sqlcommon = new SqlConnection(sqlca);
sqlcommon.Open();
SqlTransaction otcommon = sqlcommon.BeginTransaction();
try
{
string sqlcommon4 = "update OPENDATASOURCE( 'SQLOLEDB', 'Data Source=166.110.1.1;User ID=sd;Password=admin' ).yferp.dbo.INVLA set LA025='R' where LA016=' e111'";
}
SqlCommand ocom_stkmast3 = new SqlCommand(sqlcommon3, sqlcommon);
ocom_stkmast3.Transaction = otcommon;
try
{
ocom_stkmast3.ExecuteNonQuery();
}
catch (SqlException t)
{
otcommon.Rollback();
ocom_stkmast3.Dispose();
sqlcommon.Dispose();
sqlcommon.Close();
}

我的数据库连接,和修改的表不是同一个服务器上的数据库,这样就出现了错误。
无法执行该操作,因为链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务。
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。

以上问题如何解决啊,我用一个数据库连接,完成其他数据库的操作,还要写在同一个事务中。
...全文
200 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2016-06-13
  • 打赏
  • 举报
回复
多个数据库服务器,一般处理方法是建立链接服务器,这样,操作两个数据库的数据,就像操作两个表一样了

exec sp_addlinkedserver   '链接服务器名', '', 'SQLOLEDB','远程服务器名或ip地址' 
exec sp_addlinkedsrvlogin '链接服务器名'','false',null,'用户名','密码' 

多个数据源,可以考虑Transactionscope,详情见:https://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscope(v=vs.80).aspx
xw52856132 2016-06-13
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
具体地说,把你的 otcommon  删除掉,不要考虑跨服务器的“事务”。你应该在业务逻辑上来保证事后确认业务操作,不要图省事只用数据库来保证。 例如,如果有一笔支付资料进入淘宝的系统,它们后台可能要做30个不同子系统的不同操作,最后才确认这笔支付最终完成或者最终(或者提前)应该放弃。这个过程中人家不是纠结于“数据库事务”来设计软件的。 如果纠结于数据库事务,那么淘宝网后台处理效率肯定降低300倍,而且还经常死锁、崩溃。对于高性能的大系统,其实“数据库事务编程”是个坑,而不是什么省事儿的编程方法。
对于并发性要求没那么高的系统,是不是事务挺好的?感觉你的说法,事务是不是主要用来图省事啊?通过业务逻辑设计都可以替代或者说实现比事务更好?
software_artisan 2016-06-12
  • 打赏
  • 举报
回复
3楼在理!不要依赖数据库事务来保证数据一致性,至少不要在复杂业务中依赖数据库事务。
  • 打赏
  • 举报
回复
具体地说,把你的 otcommon  删除掉,不要考虑跨服务器的“事务”。你应该在业务逻辑上来保证事后确认业务操作,不要图省事只用数据库来保证。 例如,如果有一笔支付资料进入淘宝的系统,它们后台可能要做30个不同子系统的不同操作,最后才确认这笔支付最终完成或者最终(或者提前)应该放弃。这个过程中人家不是纠结于“数据库事务”来设计软件的。 如果纠结于数据库事务,那么淘宝网后台处理效率肯定降低300倍,而且还经常死锁、崩溃。对于高性能的大系统,其实“数据库事务编程”是个坑,而不是什么省事儿的编程方法。
  • 打赏
  • 举报
回复
不能跨服务器,分布式事务时不靠谱的。你应该从“没有数据库事务”的前提下重新设计自己的程序的业务逻辑。 另外,如果你设计一些符合最近3、4年互联网潮流的应用就会发现,去”数据库事务“是一个非常重要的设计能力。连单个数据库的事务操作都要去除,更何况你还要什么”分布式事务“? 基本上,使用数据库事务都是为了图省事。然而这会在系统需要单机压力增大时带来巨大的性能代价,而在服务水平扩展时则完全需要扔掉了重写系统。
让我睡一会儿 2016-06-12
  • 打赏
  • 举报
回复
你可以创建【链接服务器】,然后在进行其他的增删改查操作。 比如你的机器地址是【166.110.1.100】,先创建两个链接服务器,分别链接【166.110.1.1】、【166.110.1.2】,然后你就可以写一个跨服的语句,比如:select * from [166.110.1.1].[数据库名字].[dbo].[table1] 。 依此类推。把你实现的功能写在一个语句中,然后执行该语句,将这个语句加入到一个事物当中就可以了,

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧