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

问题描述

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

时间: 2024-10-23 22:05:22

C#中跨数据库增删改的事务控制的相关文章

数据库增删改查的代码,有吗

问题描述 数据库增删改查的代码,有吗 用SSH框架如何增删改查数据库的一张学生表,求代码!我已经写到了dao层的实现类. 解决方案 //搜集整理了一下网上的代码.找了半天居然找不到一条插入语句.好郁闷的 //感觉速度还可以.小文件.很多小应用程序在用这个数据库 //SQLite使用办法.直接COPYDLL文件System.Data.SQLite.DLL到应用程序DEBUG目录下. 然后在项目中添加引用,找到这个文件即可 //添加引用 using System;using System.Colle

c#利用webservice和wcf对oracle数据库增删改查,并判断两种方法的效率

问题描述 c#利用webservice和wcf对oracle数据库增删改查,并判断两种方法的效率 初学者,以前没有接触过webservice和wcf.现在遇到一个这样的项目,请大家给予帮助,提供源码,思路都行.当然,最好是代码了,亲,帮一个忙呗~ 解决方案 ws相对简单,WCF就是一把大牛刀,虽然很好,但是你要是杀鸡就得不偿失了.你是了解MVC的话,通信可以试试WebAPI.例子网上到处都是的

ThinkPHP 的模型使用对数据库增删改查(五)

原文:ThinkPHP 的模型使用对数据库增删改查(五) ThinkPHP 的模型使用 // 直接连接数据库,但是得先去配置文件中配置下才行class IndexAction extends Action {public function addDB(){//对应数据库的表 ,一定要对应数据库的表名  大小没关系$user =new Model('Leyangjun');//$user = M('Leyangjun');  //等同上面的new Model() $arr = $user ->se

thinkphp3.2.3版本的数据库增删改查实现代码_php实例

框架thinkphp 版本:3.2.3 内容:数据库操作 1. 多表查找一条数据 M('a表')->join("b表 on b表.id=a表.id")->where('条件')->find(); 2.查找一条数据 M('a表')->where('条件')->find(); 3.多表查询所有数据 M('a表')->join("b表 on b表.id=a表.id")->where('条件')->select(); 4.查询

Node.js操作mysql数据库增删改查_node.js

关于node.js操作mysql数据库的相关介绍请阅读全文吧.下文介绍的非常详细,具体内容如下所示:  安装mysql模块 npm install mysql 数据库准备 mysql server所在的机器IP地址是192.168.0.108,登录账户就用root@123456 在mysql中创建test数据库 在test数据库中创建一张users表 操作 连接数据库 var mysql=require('mysql'); var connection = mysql.createConnect

thinkPHP数据库增删改查操作方法实例详解_php实例

本文实例讲述了thinkPHP数据库增删改查操作方法.分享给大家供大家参考,具体如下: thinkphp对数据库增删改查进行了封装操作,使得使用更加方便,但是不一定灵活. 可以用封装的用,需要写sql,可以执行sql. 1.原始的 $Model = new Model(); // 实例化一个model对象 没有对应任何数据表 $insert_sql = "INSERT INTO sh_wxuser_collection (user_id,store_id,good_id,addtime) VAL

extjs 做数据库增删改查时,原先是全部查上来显示的,现在用条件查询,怎么在原先的位置上显示条件查询的结果

问题描述 extjs 做数据库增删改查时,原先是全部查上来显示的,现在用条件查询,怎么在原先的位置上显示条件查询的结果 问题补充:myali88 写道 解决方案 重写store的onbeforeload方法,构造查询参数,执行查询时这些参数可以直接在后台获取到.这种方式比较好理解.每次刷新(refreshGrid)都会执行这个方法.var grid;/** * grid的参数 */var params = {start : 0,limit : 1000};var rIndex;/** 操作行的i

thinkPHP数据库增删改查操作方法实例详解

本文实例讲述了thinkPHP数据库增删改查操作方法.分享给大家供大家参考,具体如下: thinkphp对数据库增删改查进行了封装操作,使得使用更加方便,但是不一定灵活. 可以用封装的用,需要写sql,可以执行sql. 1.原始的 $Model = new Model(); // 实例化一个model对象 没有对应任何数据表 $insert_sql = "INSERT INTO sh_wxuser_collection (user_id,store_id,good_id,addtime) VAL

thinkphp3.2.3版本的数据库增删改查实现代码

框架thinkphp 版本:3.2.3 内容:数据库操作 1. 多表查找一条数据 M('a表')->join("b表 on b表.id=a表.id")->where('条件')->find(); 2.查找一条数据 M('a表')->where('条件')->find(); 3.多表查询所有数据 M('a表')->join("b表 on b表.id=a表.id")->where('条件')->select(); 4.查询