c#中如何处理多个数据库事务同时提交 同时回滚

czxiang_0 2014-08-27 03:18:11
现有2个以上数据库服务,要保证他们间的数据一致。
现在楼主这么写 是否妥当? 会有什么问题吗?

private void btn_submit_Click(object sender, System.EventArgs e)
{
string strconn = System.Configuration.ConfigurationManager.AppSettings["dbconnect"];
SqlConnection cnn = new SqlConnection(strconn);
SqlCommand cmd = new SqlCommand();
SqlTransaction transaction = null;

string strconn2 = System.Configuration.ConfigurationManager.AppSettings["dbconnect2"];
SqlConnection cnn2 = new SqlConnection(strconn2);
SqlCommand cmd2 = new SqlCommand();
SqlTransaction transaction2 = null;

try
{
cnn.Open();
cnn2.Open();

string strSql = "insert into shop (code, name) values('" + lbcode.Text.Trim() + "','" + TxtName.Text + "')";

// 先插入A库
transaction = cnn.BeginTransaction();
cmd.Transaction = transaction;
cmd.Connection = cnn;

cmd.CommandType = CommandType.Text;
cmd.CommandText = strSql;
cmd.ExecuteNonQuery();

// 后插入B库
transaction2 = cnn2.BeginTransaction();
cmd2.Transaction = transaction2;
cmd2.Connection = cnn2;

cmd2.CommandType = CommandType.Text;
cmd2.CommandText = strSql;
cmd2.ExecuteNonQuery();

// 提交事务
transaction.Commit();
transaction2.Commit();

}
catch (Exception ex)
{
transaction.Rollback();
transaction2.Rollback();
}
finally
{
cnn.Close();
cnn2.Close();
}
}



本来楼主想用建立链接服务器的方法,在数据库中通过存储过程来同步数据。
可是阿里云的RDS不支持连接服务器,同时也不提供SA的权限。
除了上面同时写2个库的办法,不知道有何高人还有其他的建议?
...全文
871 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepSayingNo 2014-08-28
  • 打赏
  • 举报
回复
1、如果你对数据的一致性非常高,那么就需要给每天数据按序有流水号,每一次插之前获取最大流水号,从这往后插 2、如果你对数据一致性不是那么高,可以在服务器A的接收数据的表建立触发器,在向该表插入的时候也往其他数据库服务器上的表中插。
Tiger_Zhao 2014-08-27
  • 打赏
  • 举报
回复
实时同步是做不到100%的,只能是近似同步。
极端一点
transaction.Commit(); //这句成功了
transaction2.Commit(); //这句出错了

不就不同步了!

有一种方案是两个服务器上各跑一个服务程序,前台程序把 INSERT 命令发给它们,让服务程序进行数据的更新。
即使其中一个出错了,可以继续重试。
即使是数据库停掉了,那么把命令存起来,下次启动时继续执行。
这样可以非实时地实现数据同步。
SqlScope 4.0By Lostinet.comISqlScope的模型和实现代码。附加例子。优点: 自动分配释放数据库连接 执行数据库操作的代码不需要明确知道数据库连接的时间和地点,所以代码更容易编写和管理。 支持显式事务的多层嵌套。这样可以再任何时候建立回滚点和进行任何形式的提交回滚。 使用using来对连接,查询,和事务进行管理,代码简洁明了。 支持多种常用的数据库访问的Method,使数据库操作代码更短。 通过把ISqlScope放到较大的范围内,可以实现该范围内数据连接的高效利用。 { 例如: using(ss.EnterQuery()) { DataGrid1.DataBind(); } 这个时候, DataGrid1_OnItemDataBound...里 { using(ss.EnterQuery())//数据库连接已打开,继续使用。 { //..进行查询和对DataGridItem进行操作 } } }对例子进行测试:如果您的电脑上启动了Microsoft SqlServer 2000并且启用了Windows验证, 那么这个例子就可以直接编译然后执行了。不能运行的情况自己解决关于ISqlScope.CreateXXX,ISqlScope.ExecuteXXX的参数都是string cmdtext,params object[] sqlparamscmdtext是基本的sql语句。sqlparams是附加的用于SQL查询操作的参数。参数是可变长的,原理就像string.Format(str,a0,a1..)一样。可以(cmdtext,p0,p1,p2..)这样调用,也可以直接传递object[]数组。详细请看C#的params关键字附加的参数按 @p0,@p1,@p2,...等名称输入到SqlCommand.Parameters。有兴趣的看SqlScopeImpl.CreateCommand方法的代码如果附加参数为null,那么将以DBNull.Value插入到SqlParameter。提示:在Main选择例子来运行。最好先打开SqlServer事件探查器来监视程序对SqlServer的操作活动。对于ss.ExecuteXXX(@"SELECT *FROM EmployeesWhere EmployeeID=@p0" ,cid);这样的写法,最好为字符串的显示改变背景颜色。操作:VS.Net-工具-选项-环境-字体和颜色-显示项-字符串(最下面) 背景色推荐改为浅灰色例子:A,B,C是基本的数据库操作D讲解了ExecuteReader,CreateAdapter,CreateCommand的用法。E是事务的初步概念。由E开始,深化地讲解一下ISqlScope对事务的操作的简便C#语法。这个是和dotnet的Exception体制结合的很深的。如果没有Exception的概念。建议先去看看dotnet对于Exception的介绍。所提供的例子不够复杂。如果有更高要求的应用,可以写信联系我。 lostinet@lostinet.com 2003-5-21 主要的实现由SqlScopeImpl移动到Connection去了。H,I是两个关于新特征的例子

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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