2011-09-14 2 views
1

저는 TransactionScope를 처음 사용합니다. 나는 단지 아래 코드에서 내가하고있는 일이 올바른지 확인하고 싶다.EF4에서 TransactionScope에 대한 도움말

private void DoSomeWork() 
{ 
    using (var context = new MyEntities()) 
    using (TransactionScope scope = new TransactionScope()) 
    { 
     context.Connection.Open(); 

     int ID = context.CallUpdateStoredProc(); 

     RecursiveDelete((EntityConnection)context.Connection, ID); 

     context.Connection.Close(); 

     scope.Complete(); 
    } 
} 

private void RecursiveDelete(EntityConnection connection,int someID) 
{ 
    using (var context = new MyEntities(connection)) 
    { 
     var UpdatedLinks = context.CallSaveStoredProc(someID).ToList(); 

     foreach (int UpdatedLink in UpdatedLinks) 
     { 
      RecursiveDelete(connection,UpdatedLink);  
     } 
    } 
} 

답변

0

, 그래,이 올바른지, 당신은 일반적으로의 패턴을 사용 저 지르다. Complete을 호출 할 때 트랜잭션이 커밋되지 않지만 TransactionScope이 처리되면 트랜잭션이 커밋되지 않습니다. TransactionScope.Complete에 대한 문서에서

:

하여 TransactionScope 객체가 거래를 만든 경우 자원 관리자 사이에 커밋의 실제 작업은 끝 사용하여 문에서 발생

.

또한 예제 코드의 주석에 표시된대로 Complete에 대한 호출을 만들어야하는지 여부를 의식적으로 결정합니다.

다시 TransactionScope.Complete (강조 광산)에 대한 문서에서 :

당신이 만족하면 범위 내에서 모든 작업이 이 성공적으로 완료되는 번만 이 있음을 알리기 위해이 메소드를 호출한다 트랜잭션 관리자는 모든 리소스의 상태가 이고 트랜잭션을 커밋 할 수 있습니다. 여부 TransactionScope가 엔티티 프레임 워크와 함께 사용할 수에 관해서는 MSDN에 대한 설명서가 "How to: Manage Transactions in the Entity Framework"가 표시라는 제목으로

지금, 대답은 '예'입니다.

0

Entity Framework 4는 TransactionScope를 인식하므로 예제가 올바르게 작동합니다. this example on MSDN을 참조하십시오. 당신이 Complete method를 호출하면 그것은 curent Transaction가 준비가되어 있음을 나타냅니다,

// Use overloads of constructor if you need to fine-tune the transaction 
using (var tx = new TransactionScope()) 
{ 
    // Do your work. 

    // Call Complete if the work is truly complete. 
    // Note, if you determine through logic, you don't 
    // have to call Complete. 
    tx.Complete(); 
} 

:

당신이 TransactionScope class를 사용하는 방법의 측면에서