【问题标题】:Algorithm for distributed transaction involving database and file system on both client side and server side涉及客户端和服务器端数据库和文件系统的分布式事务算法
【发布时间】:2012-03-06 04:04:12
【问题描述】:

我正在开发一个基于 .Net 的客户端/服务器版本控制系统,主要涉及

在客户端: 嵌入式数据库 文件系统

在服务器端: Sql 服务器数据库 文件系统

每次从客户端上传新版本到服务器时,都会发生以下步骤: 1. 使用新的文件元数据(新版本号、时间戳等)更新客户端数据库 2.通过HTTP向服务器发送文件,将文件复制到服务器的文件系统中 3.文件传输完成后,用新的元数据更新Sql server db

整个过程被视为一个事务。问题是,在失败的情况下,我们很难根据错误发生的不同阶段来回滚事务。

我的问题是,处理这种分布式提交的算法是什么?我听说过 3 阶段提交,这适合这种情况吗?

谢谢,

【问题讨论】:

  • 你是如何处理 Commit / RollBack 的,目前还不是指 2 Phase Commit..?
  • 数据库事务由 DBMS 提供。对于文件系统,我只使用 C# 代码来复制/备份当前或新版本。谢谢。
  • 没问题..只是想知道您当前的流程是什么..我粘贴的内容可能有助于阐明一些想法

标签: c# distributed-transactions


【解决方案1】:

这是你可以尝试的东西,但你必须改进这个例子..这只是你可以做什么的一个例子

using (SqlConnection conn1 = new SqlConnection())
{
    using (SqlConnection conn2 = new SqlConnection())
    {
        try
        {
            using (var scope = new System.Transactions.TransactionScope())
            {
                //when opening the connection, its' implicitly enlisted in the transaction scope
                conn1.Open();
                SqlCommand command1 = new SqlCommand(cmdText, conn1);
                //set parameters
                command1.ExecuteNonQuery();

                conn2.Open();
                SqlCommand command2 = new SqlCommand(cmdText, conn1);
                //set parameters
                command2.ExecuteNonQuery();

                //transaction commit/rolls back if an exception is thrown
                scope.Complete();
            }
        }
        catch (System.Transactions.TransactionAbortedException ex)
        {
            //handle aborted transaction
        }
        catch (Exception ex)
        {
            //handle other exceptions
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2014-07-05
    相关资源
    最近更新 更多