2011-08-19 4 views
0

.netでのトランザクションの処理。サブ関数を通じてトランザクションを流すことに関する質問がありました。オブジェクトコンテキストがサブメソッド間で共通する場合は、依存トランザクションを使用する必要がありますか?次のコードでたとえばTransactionScope関数

、 - 私はサブ関数がトランザクションの一部になりたい

public class EmployeeRepository 
{ 
    private EmployeeContext ec;   
    public EmployeeRepository() 
    { 
     objectContext = new EmployeeContext();    
    }  
    public InitTransaction(EmployeeEntity emp1) 
    { 
     using (TransactionScope transaction = new TransactionScope()) 
     { 
      try 
      { ec.employees.AddObject(emp1); 
       SubFunction1(); 
       ec.SaveChanges();        
      } 
      catch 
      { 
       //catch 
      } 
     } 
     //commit the transaction here 
     ec.AcceptAllChanges(); 
    } 

    public SubFunction1() 
    { 
     //some processing 
     //using same object context 
     ec.someother.AddObject(someobject); 
     ec.SaveChanges(); 
    } 
} 

(これはベストプラクティスであるかどうかわからない)私のクラスのコンストラクタでオブジェクトコンテキストを宣言同じように? この場合、同じオブジェクトコンテキストを使用していても、SubFunction1内で依存トランザクションを使用する必要がありますか?または、SubFunction1内に

using (TransactionScope transaction = new TransactionScope()); 

を追加する必要があります。正しい方向へのポインタは非常に高く評価されるでしょう。

答えて

1

トランザクションスコープは入れ子にすることができます(SQL @@ TRANCOUNTメカニズムと同様に動作します)。したがって、理論上、TransactionScopesをリポジトリで使用することができます。子テーブル関係ACIDだけでなく、ビジネス/サービスレイヤー(例えば、複数のエンティティ間、複数のデータベース間、さらにはメッセージキューやTransactional file systemsなどの他のリソース間でも分散トランザクションを持つなど)にも使用できます。

default isolation level of TransactionScopeがSerializableを読むされていることを

注意 - 。。これは、ロック/デッドロックにつながることができます

+0

を見ては、今、私の質問は - としての私のコードの作品が-i.e.あります同じオブジェクトコンテキストを使用すると、subfunction1はトランザクションの一部になります。 SubFunction1でトランザクションを明示的に開始する必要があります。 – user275157

+1

はい - 動作します - SubFunction1(およびSubFunction1によって呼び出されるもの)は、デフォルトで、TransactionScopeに登録されます。 *コンテキストやSQLConnectionsなどの「トランザクション」認識リソースは自動的に登録されます。 – StuartLC

+0

入力いただきありがとうございます。したがって、subfunction1の新しいトランザクションスコープはありません。また、分離レベルで - 私はmysqlを使用しており、失敗したトランザクションをエンドユーザにバブリングするオプションがあります(再試行するために)。だから、シリアライズ可能な読書は安全だと思った。私は、分離レベルをコミットして再コミットする必要がありますか? – user275157

0

あなたはあなたがTransactionScope

を避けることができ、同じObjectContext周りを通過する依存性注入を使用して代わりの内側Contextを作成することを検討することができますリポジトリはconstを通してそれを注入するルクター。

public class EmployeeRepository 
{ 
    private EmployeeContext ec;   
    public EmployeeRepository(EmployeeContext objectContext) 
    { 
     ec = objectContext;    
    }  

} 

this answer

+0

ありがとうございます。コードは似ています(分かりやすくするために省略しただけです)。私は実際にEmployeeRepositoryにIdisposableを実装し、接続を破棄します。すべての操作はwcf restサービスで行われます。 – user275157