0

2 つのデータベースがある状況があります。

Manager には Companies テーブルがあり、この値に基づいて新しい DB を作成する必要があります。

だから私はTransactionScopeを使用しています。知りたいのですが、以下は正しいですか?

これは両方の変更をロールバックしますか? エラーが発生した場合、両方のDBで?

using (TransactionScope ts = new TransactionScope())
{
    try
    {
        using(var ManagerContext = new ManagerEntities(
            ConnectionStringManager.GetManagerConnectionString()))
        {
            //Operations on Manager DB                         
            // Create new Company and get NEWCOMPANYID 
            // -- Used to create new DB
        }

        using(var companyContext = new CompanyEntities(
            ConnectionStringManager.GetCompanyConnectionString(
                NEWCOMPANYID.ToString())))
        {
            //Create New Company DB
        }

        ts.Complete();
    }
    catch (Exception ex)
    {
        ts.Dispose();
    }
}
4

2 に答える 2

2

これは問題ありませんが、Marc が説明したように DTC がトリガーされます。両方のコンテキストが共有する単一のSqlConnection(または) を使用することで、DTC を回避できます。EntityConnectionを使用して、接続の現在のデータベースを切り替えることができますChangeDatabase。これにより、分散トランザクションの必要がなくなります。

EF はデフォルトですべてのアクションに対して接続を開いたり閉じたりするため、接続を明示的に開く必要もあります。これにより、複数の DTC 登録 (2 つ以上) が発生します。これは EF の設計上の欠陥です。

于 2013-09-09T10:44:53.837 に答える
2

これらの両方のデータベース コンテキストがTransactionScope認識されており、(接続文字列などで) アンビエント トランザクションの登録が明示的に無効にされていない限り、はい: 正常に動作するはずです。2 つの接続文字列が異なると仮定すると、分散トランザクション (DTC) が必要になることは間違いありませんが、それでよいかどうかはユーザー次第です。接続文字列が同一の場合は、代わりに LTM を使用できます (オーバーヘッド/構成が少なくなります)。

tryコメントによると、 /は必要ないことに注意してくださいfinally

于 2013-09-09T08:11:50.283 に答える