2010-03-02 4 views
5

Lin.Ty Entities에서 System.Transactions.TransactionScope을 사용하는 것이 가치가 있습니까?C# TransactionScope - L2E

MS documentation에서 ObjectContext.SaveChanges() 내의 SQL 호출은 모두 내부적으로 하나의 트랜잭션으로 롤아웃됩니다.

우리는 파일 시스템에 로컬 SQLite 데이터베이스 인 데이터베이스 연결이 1 개 있습니다. 우리는 데이터베이스에 대한 모든 작업을 원자 적으로 처리하기를 원합니다. TransactionScope가 필요합니까? I.E. 삭제, 업데이트, 삽입 등을 요구할 때, 우리는 그것들이 모두 일어나기를 원하거나 전혀 원하지 않습니다.

답변

3

존, 아니요, 아니요, 당신은 TransactionScope를 사용할 필요가 없습니다. Optimistic 동시성은 Linq에 의해 자동으로 처리됩니다. 제공하는 링크의 코드 샘플은 거래를 직접 롤백 할 필요가 없다는 것을 설명합니다. 샘플 코드와 동일한 코드를 사용합니다.

try 
    { 
     // Try to save changes, which may cause a conflict. 
     int num = context.SaveChanges(); 
     Console.WriteLine("No conflicts. " + 
      num.ToString() + " updates saved."); 
    } 
    catch (OptimisticConcurrencyException) 
    { 
     // Resolve the concurrency conflict by refreshing the 
     // object context before re-saving changes. 
     context.Refresh(RefreshMode.ClientWins, orders); 

     // Save changes. 
     context.SaveChanges(); 
     Console.WriteLine("OptimisticConcurrencyException " 
     + "handled and changes saved"); 
    } 

우려 사항을 처리하는 새로 고침, 다시 저장하십시오. try 블록 내에서 예외를 throw하여이를 테스트 할 수 있습니다.

안부

1

ObjectContext.SaveChanges 개를 단일 거래 (예 : 변경하려는 데이터 읽기 및 변경 사항)에 포함하려면 TransactionScope을 사용해야합니다.

0

당신이 (오히려 아닌 것 같습니다하지만) 리처드는 말한다 일을해야하는 경우 다음과 같은 코드를 사용할 수

TransactionManager transactionManager = null; 

try 
{ 
    bool isBorrowedTransaction = ConnectionScope.Current.HasTransaction; 
    transactionManager = ConnectionScope.ValidateOrCreateTransaction(true); 

    //MANY SAVES 

    if (!isBorrowedTransaction && transactionManager != null && transactionManager.IsOpen) 
     transactionManager.Commit(); 
} 
catch (Exception ex) 
{ 
    if (transactionManager != null && transactionManager.IsOpen) 
     transactionManager.Rollback(); 
    log.Error("An unexpected Exception occurred", ex); 
    throw; 
}