0

何かが失敗した場合にすべての変更をロールバックできるように、 1 つのトランザクションで 2 つの異なる SQL Azure フェデレーション データベースに保存する必要があります。現在、互いに独立して処理している 2 つの別個のコード ブロックがあります。TransactionScope を使ってみたのですが、どうやら SQL Azure ではサポートされていないようです。

    using (EVENTContext dc = new EVENTContext(
GetConnectionString(1)))
    {
        string federationCmdText = @"USE FEDERATION [fed] ([dist] = '"+ GetDist(1) +"') WITH FILTERING = OFF, RESET";
        ((IObjectContextAdapter)dc).ObjectContext.Connection.Open();
        dc.Database.ExecuteSqlCommand(federationCmdText);
        dc.EVENTS.Add(e);
        dc.SaveChanges();
    }


    using (EVENTContext dc = new EVENTContext(
GetConnectionString(2)))
    {
        string federationCmdText = @"USE FEDERATION [fed] ([dist] = '"+ GetDist(2) +"') WITH FILTERING = OFF, RESET";
        ((IObjectContextAdapter)dc).ObjectContext.Connection.Open();
        dc.Database.ExecuteSqlCommand(federationCmdText);
        dc.EVENTS.Add(e2);
        dc.SaveChanges();
    }

単一のトランザクションで複数のデータベースに保存するにはどうすればよいですか? 最近 Unit of Work について読み始めましたが、それが必要かどうかはわかりません。

4

3 に答える 3

0

OK、これについてしばらく考えた後、自分の質問に答えます。これが私がやろうとしていることです:

1)ユーザーアクションごとにアクションIDを生成し(それが何であれ)、ルートデータベースのテーブルに書き込みます

2) このアクション ID をすべての行に追加して、どの行がどのアクションに追加されたかを追跡できるようにします

3) 各データベースに個別にコミットする

4) ルート データベース テーブルからアクション ID を削除します。

これらのステップはすべて 1 つのユーザー アクションの一部であり、1 つのステップで例外がスローされた場合、次のステップは実行されません。

アプリケーション側では、連合テーブルから返されたもののアクション ID がルート データベース テーブルに表示されるかどうかを確認します。その場合、変更のコミット中にエラーが発生しました。そうでない場合は、トランザクションが成功したことになります。

最後に、定期的にルート データベース テーブルからアクション ID を取得し、そのアクション ID を持つすべての行をクリーンアップし、それらをすべて削除した後、アクション ID も削除するワーカー ロールを実行できます。

于 2012-10-18T02:49:12.603 に答える
0

Azure SQL DB に接続する場合、TransactionScope はサポートされていませんでした。(コード サンプルのように) 個別のコンテキストを個別にコミットするか、上記のように独自の補正ロジックを実装する必要がありました。Azure DB で TransactionScope がサポートされるようになったため、どちらも不要になりました。SQL Azure の TransactionScope() を参照してください。

于 2015-11-20T06:20:35.617 に答える
0

残念ながらできません。サポートされていません。最も近い方法は、レコードを保留状態 (その目的で追加した列) に保存し、両方がコミットされた場合は、レコードの状態をアクティブ (またはそれらの線に沿ったもの) に変更することです。つまり、自分で管理し、これらの操作を長時間実行されるトランザクションとして扱う必要があるということです。

于 2012-10-18T01:22:45.270 に答える