2008-10-21 5 views
3

많은 테이블에서 작동하고 꽤 많은 SQL 명령을 실행하는 매우 복잡한 비즈니스 논리를 실현하는 데 도움이 필요합니다. 그러나 데이터가 일관성없는 상태로 유지되지 않도록하려면이 순간에는 중첩 된 트랜잭션이 필요하지 않은 솔루션이 표시되지 않습니다. 내가 달성하고자하는 것과 유사한 시나리오를 보여 간단한 의사 코드를 작성 :LINQ to SQL의 중첩 된 트랜잭션

Dictionary<int, bool> opSucceeded = new Dictionary<int, bool>(); 

for (int i = 0; i < 10; i++) 
{ 
    try 
    { 
     // this operation must be atomic 
     Operation(dbContext, i); 

     // commit (?) 

     opSucceeded[i] = true; 
    } 
    catch 
    { 
     // ignore 
    } 
} 

try 
{ 
    // this operation must know which Operation(i) has succeeded; 
    // it also must be atomic 
    FinalOperation(dbContext, opSucceeded); 

    // commit all 
} 
catch 
{ 
    // rollback FinalOperation and operation(i) where opSucceeded[i] == true 
} 

나에게 가장 큰 문제는 다음 FinalOperation이 실패 할 경우, 모든 작업 동작 (I) 성공하는 것을 보장하는 방법 롤백됩니까? 나는 또한 단일 작업 (i)의 실패를 무시할 수 있기를 바랍니다.

중첩 된 TransactionScope 개체를 사용하여이를 달성 할 수 있습니까? 그렇지 않은 경우 어떻게 이러한 문제에 접근합니까?

답변

2

질문에 대답하는 경우 데이터베이스에 대해 일련의 작업을 수행하고 각 작업이 성공했는지 실패했는지 (간단한 코드의 사전)를 결정하는 데 충분한 정보를 얻으려고합니다.

거기에서부터 실패한 경우 이전의 모든 성공적인 작업을 롤백해야하는 최종 작업이 있습니다.

단순한 거래의 경우와 똑같은 것으로 보입니다. 최종 작업의 실패로 인해 전체 트랜잭션이 롤백되는 경우 (여기서는 FinalOperation이 다른 이유로 이러한 정보를 사용하지 않는다고 가정 할 경우) 하위 작업/초기 작업의 성공 또는 실패를 추적 할 필요가 없습니다.

설명 된 블록을 입력하기 전에 트랜잭션을 시작하고 FinalOperation의 상태를 알고 나서 전체 작업을 커밋하거나 롤백하십시오. 현재의 설명에서 볼 수있는 한 하위 작업을 중첩 할 필요가 없습니다.

아마도 내가 누락 된 항목이 있습니까? (이전/하위 작업을 다시 작성하려는 경우 완전히 다른 작업이 될 수 있지만 전체 작업 패키지를 롤링하는 최종 작업의 실패로 인해 간단한 트랜잭션을 사용할 수 있음).