2010-03-05 7 views
3

각각 자체 Transaction (오류 발생시 Begin/Commit 및 Rollback)을 처리하는 두 개의 PL/SQL Stored 프로 시저가 있습니다. .Net 코드에서 아래에 표시된 것처럼이 두 SP를 호출합니다.TransactionScope 및 저장 프로 시저?

using (TransactionScope ts = new TransactionScope()) 
    { 
      CallSP1(); 
      CallSP2(). 
      ts.SetComplete(); 
    } 

하면 SP2에 내 전화가 CallSP1에 의한 변경을 롤백합니다 실패()? 롤백하지 않으면 저장 프로 시저 내에서 .Net 응용 프로그램의 트랜잭션을 처리하는 것이 더 좋습니다.

답변

10

첫 번째 저장 프로 시저 SP1이 커밋을 발행하면 이미 변경 한 내용은 영구적입니다. 이 경우 SP2가 실패하면 SP1에서 변경 한 내용은 롤백되지 않습니다.

IMO 호출 응용 프로그램은 트랜잭션 논리를 처리하는 응용 프로그램이어야합니다. 즉 PL/SQL 프로 시저에서 커미트 또는 롤백을 발행하지 않아야합니다. 오류를 호출 응용 프로그램에 전파하면 PL/SQL 엔진은 전체 트랜잭션이 아닌 실패한 프로 시저가 수행 한 작업 만 롤백합니다.

오류가 발생하면 호출 응용 프로그램이 수행 할 작업을 결정하십시오 (다시 시도, 반 작업 또는 롤백).

+2

+1. 프로 시저가 커밋되지 않아야합니다. 궁극적 인 호출자가 아닌 한 세이브 포인트/롤백 만해야합니다. 프로그램의 주 {}. –

2

SP1이 커밋을 수행하면 SP2에서 발생하는 문제가 없습니다. SP1의 변경 사항은 롤백되지 않으며 커밋되었습니다.

1

첫 번째 저장 프로 시저가 항상 커밋 또는 롤백을 발행하면 두 번째 저장 프로 시저가 수행하는 트랜잭션에 영향을 줄 수 없습니다.

오류가 발생할 경우 호출 응용 프로그램이 전체 트랜잭션을 제어하지만 저장 프로 시저가 자체 변경 사항을 롤백하도록하려면이 작업을 수행하는 한 가지 방법은 저장 프로 시저의 시작 부분에 저장 점을 정의하는 것입니다 . 그런 다음 스토어드 프로 시저의 예외 블록은 트랜잭션 시작이 아닌 세이브 포인트로 롤백 할 수 있습니다 (이 경우 커밋은 스토어드 프로 시저에 포함되어서는 안 됨). 물론이 시나리오에서는 저장 프로 시저가 응용 프로그램에 오류가 발생했음을 알리고 응용 프로그램이 해당 사례를 적절하게 처리하는 것이 중요합니다.