Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 客户端和服务器端同时涉及数据库和文件系统的分布式事务处理算法_C#_Distributed Transactions - Fatal编程技术网

C# 客户端和服务器端同时涉及数据库和文件系统的分布式事务处理算法

C# 客户端和服务器端同时涉及数据库和文件系统的分布式事务处理算法,c#,distributed-transactions,C#,Distributed Transactions,我正在开发一个基于.Net的客户机/服务器版本控制系统,它基本上包括 在客户端: 嵌入式数据库 文件系统 在服务器端: Sql server数据库 文件系统 每次从客户端将新版本上载到服务器时,都会执行以下步骤: 1.使用新文件元数据、新版本、时间戳等更新客户端数据库 2.通过HTTP将文件发送到服务器,将文件复制到服务器的文件系统中 3.文件传输完成后,使用新的元数据更新Sql server db 整个过程被视为一个事务。问题是,如果失败,我们很难根据错误发生的不同阶段回滚事务 我的问题是,处

我正在开发一个基于.Net的客户机/服务器版本控制系统,它基本上包括

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

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

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

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

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


谢谢,

这是您可以尝试的,但您必须改进示例。这只是您可以做的示例

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
        }
    }
}

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

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
        }
    }
}

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