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个库的办法,不知道有何高人还有其他的建议?
...全文
1004 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepSayingNo 2014-08-28
  • 打赏
  • 举报
回复
1、如果你对数据的一致性非常高,那么就需要给每天数据按序有流水号,每一次插之前获取最大流水号,从这往后插 2、如果你对数据一致性不是那么高,可以在服务器A的接收数据的表建立触发器,在向该表插入的时候也往其他数据库服务器上的表中插。
Tiger_Zhao 2014-08-27
  • 打赏
  • 举报
回复
实时同步是做不到100%的,只能是近似同步。
极端一点
transaction.Commit(); //这句成功了
transaction2.Commit(); //这句出错了

不就不同步了!

有一种方案是两个服务器上各跑一个服务程序,前台程序把 INSERT 命令发给它们,让服务程序进行数据的更新。
即使其中一个出错了,可以继续重试。
即使是数据库停掉了,那么把命令存起来,下次启动时继续执行。
这样可以非实时地实现数据同步。

27,579

社区成员

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

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