ODP.NET을 사용하여 Oracle 데이터베이스에서 데이터를 읽는 WCF 서비스가 있습니다. 이 서비스는 또한 데이터베이스에 기록하지만 간접적으로 모든 업데이트와 삽입은 COM30을 통해 액세스하는 이전 비즈니스 계층 (TransactionScope에 있음)을 통해 이루어 지므로 간접적으로 기록됩니다. 오래된 레이어는 ODP.NET이 아닌 ODBC를 통해 Oracle에 연결됩니다."비동기"커밋을 처리하는 좋은 방법은 무엇입니까?
내가 가진 문제는 오라클이 사용하기 때문에이 2 단계 커밋 것을, 그리고 이전 비즈니스 계층은 ODBC하지 ODP.NET, 가끔 데이터가 실제로 사용할 수있는 TransactionScope.Commit()
에 반환되기 전에 트랜잭션을 사용하고 있기 때문에 서비스 계층으로부터의 읽기.
a similar post about a Java user having trouble like this도 스택 오버플로를 참조하십시오.
오라클 posted that there isn't much I can do about this 문제의 담당자 :
이 어쩌면 방식으로 인해 OLETx ITransaction의에 :: 커밋() 메소드는 동작합니다. 2 PC의 1 단계 (즉, 준비 단계)가 모두 성공하면 관리자가 실제로을 커밋하지 않은 경우에도 커밋을 반환 할 수 있습니다. 성공한 "준비"가 모두 인 경우 자원 관리자 이 지점 이후 임의로 중단 할 수 없음을 보증합니다. 이 (A 통신 장애를 말할 인해)이 MSDTC에서 "커밋"통지 을받지 않았기 때문에 따라서 자원 관리자는 구성 요소의 커밋 요청이 성공적으로 을 반환 범하지 수에도 불구하고. 에서 행을 선택하면 즉시 이 표시 될 수 있습니다. 이 실제로 실행 된 후에 데이터베이스에 이 발생했습니다. 이 선택을 실행했습니다. 귀하의 선택은 이 아니므로 일관된 읽기 의미론으로 인해 새로운 행을 볼 수 없습니다. 의 경우 " 성공 후 커밋 성공"최적화는 MSDTC 구현의 일부이므로 Oracle에서이 작업을 수행 할 수있는 방법은 없습니다.
그래서, 내 질문은 이것이다 :
나는 2PC의 경우 두 번째 부분을 파악의 (제목을 통해 "asyc")을 가능한 지연 문제를 다루는에 대해 이동하는 방법 실제로 발생하므로 Commit()
호출이 반환 된 후 내가 삽입 한 데이터 (간접적으로)를 실제로 선택할 수 있는지 확인할 수 있습니까?
큰 시스템은 데이터가 즉시 읽을 준비가되지 않았다는 사실을 어떻게 처리합니까?
해당 링크에서 제안한 내용을 시도해 보셨습니까? odp.net 11.1.07.20 및 Oracle 11로 이전하십시오. – tuinstoel
업그레이드 할 수는 있지만 오라클 버전은 제 제어 권한이 없습니다. 비즈니스 계층은 아직 준비가되지 않았기 때문에 조만간 제공 될 예정입니다. –