2012-02-14 7 views
2
私は基本的にクライアント側で

アルゴリズム

を必要とするネットベース、クライアント/サーバーのバージョン管理システムに取り組んでいます

: 埋め込まデータベース ファイルサーバー側でシステム

: SQL ServerのDB ファイルシステム

毎回新しいバージョンは、以下のステップが起こる、クライアントからサーバーにアップロードされます。 1.アップデート2. HTTP経由でサーバーにファイルを送信し、サーバーのファイルシステムにファイルをコピーします。 3.ファイル転送が完了したら、SQL Serverデータベースを次のように更新します。新しいメタデータ

プロセス全体がトランザクションとして扱われます。問題は、エラーが発生した場合、エラーが発生した異なる段階に基づいてトランザクションをロールバックするのが難しいことです。

私の質問は、このタイプの分散コミットを処理するアルゴリズムは何ですか?私は3フェーズコミットについて聞いたことがありますが、それはこのシナリオに適していますか?

おかげで、

+0

どのようにコミットを処理しているが/何ができるかの一例に過ぎませんロールバックの現在も2フェーズコミットを意味していない..? – MethodMan

+0

データベーストランザクションはDBMSによって提供されます。ファイルシステムの場合は、現在のバージョンまたは新しいバージョンをコピー/バックアップするためにC#コードを使用するだけです。ありがとう。 – sean717

+0

問題はありません。あなたの現在のプロセスが何であるか疑問に思っています。私がペーストしたものは、いくつかのアイデアにいくつかの光を当てるのに役立つかもしれません。 – MethodMan

答えて

0

これはあなたが試すことができるものですが、あなたは..this例を改善する必要がありますあなたが

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