Алгоритм распределенной транзакции с использованием базы данных и файловой системы как на стороне клиента, так и на стороне сервера. - PullRequest
2 голосов
/ 14 февраля 2012

Я работаю в системе управления версиями клиент / сервер на основе .Net, которая в основном включает

На стороне клиента: встроенная файловая система базы данных

На стороне сервера: файловая система базы данных Sql server

Каждый раз, когда новая версия загружается на сервер с клиента, выполняются следующие шаги: 1. Обновите клиентскую базу данных метаданными нового файла (новая версия #, отметки времени и т. Д.) 2. Отправьте файл насервер через HTTP, скопируйте файл в файловую систему сервера 3. По завершении передачи файла обновите базу данных Sql server новыми метаданными

Весь процесс рассматривается как транзакция.Проблема в том, что в случае неудачи нам трудно откатить транзакцию, основываясь на другой стадии, на которой происходит ошибка.

Мой вопрос заключается в том, каков алгоритм для обработки этого типа распределенной фиксации?Я слышал о 3-фазном коммите, это подходит для этого сценария?

Спасибо,

1 Ответ

0 голосов
/ 14 февраля 2012

это то, что вы можете попробовать, но вам нужно улучшить пример .. это просто пример того, что вы могли бы сделать

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