2013-12-22 4 views
1

아마도 PetaPoco와의 트랜잭션을 처리하는 데있어 새로운 경험이 될 수 있으므로이 질문은 실제로 멍청한 질문 일 수 있습니다. 문제 PetApoco를 microORM으로 사용하여 db 트랜잭션을 처리해야하는 문제에 직면했습니다. 트랜잭션의 .Complete() 메소드 바로 전에 예외를 throw하면 모든 것이 올바르게 롤백되지만, 예외를 catch하는 경우에는PetaPoco 트랜잭션이 롤백되지 않음

Using scope As PetaPoco.Transaction = db.GetTransaction() 
    ' try/catch here and if the db command fails transaction won't roll back 

    scope.Complete() 
End Using 

db 작업 중 하나가 실패하면 트랜잭션이 롤백되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+0

PetaPoco 거래에 익숙하지 않습니다. 그러나 PetaPoco의 코드를 빠르게 보면 트랜잭션 관리는 Microsoft 환경에서 우스꽝스럽고 솔직히 쓸모없는 것처럼 보입니다. 왜 트랜잭션 코드를 표준 TransactionScope using 문으로 처리해야합니까 (예 : http://msdn.microsoft.com/library/ee818746.aspx) 대부분의 표준 데이터베이스에서 정상적으로 작동해야합니다. –

+0

Simon, 나는 후드 아래에서 petapoco가 사용하는 것이 petapoco를 사용하는 경우에도 "수동으로"트랜잭션을 롤백 할 수는 없지만 "트랜잭션을 롤백하려는 경우에는 다음과 같이 Complete 메서드를 호출하면 안됩니다 예를 들어, 범위 내에서 예외를 throw 할 수 있습니다. 트랜잭션이 참여하는 트랜잭션은 롤백됩니다. " 하지만 어떤 이유로 나는 .Compete()를 호출하지 않으려했지만 첫 번째 db 쿼리는 동일하게 succeded했습니다. 그런데 평범한 .NET 메소드를 사용하여 여기에 다시보고 할 것입니다. – Manight

답변

2

문제점은 경로를 따라 가로채는 예외를 기반으로 scope.Complete()가 "call/not call"을 올바르게 처리하지 못했습니다. particulart에서 부울 플래그 "rollBackTransaction"이 false로 시작한 다음 트랜잭션 내부에서 try/catch 블록 중 하나가 발생하고 예외가 발생하면 true로 업데이트됩니다. 끝에 난 그냥 그것을 확인 :

.Complete()을 사용하여 블록을 닫기 전에 호출되지 않은 경우이 결국 다시 트랜잭션을 롤백합니다 사이먼 느릅 나무에 의해 제안 TransactionScope에 대한뿐만 아니라 사용할 수 있습니다
    If Not rollBackTransaction Then 
         scope.Complete() 
        End If 

.

거짓 플래그가 발생하여 매번 scope.Complete() 메서드를 호출하는 것은 자체 처리 예외를 발생 시켜서 주 트랜잭션에서 예외를 발생시키지 않는 하위 트랜잭션을 호출하는 것이 었습니다. 블록을 올바르게 "rollBackTransaction"플래그를 업데이 트하십시오.

내가 배운 점은 트랜잭션 내에서 try/catch를 사용하는 경우 호출하는 외부 메서드가 예외가 발생하면 예외를 발생시키고 범위를 호출 할 때마다 플래그를 모두 업데이트해야한다는 것입니다. .완전한().

어쨌든 Simon, .NET 기능을 지적 해 주셔서 감사합니다. 매우 유용하다고 생각됩니다. 트랜잭션에 ... 파일 시스템이 변경 될 것입니다.

관련 문제