2009-11-20 6 views
1

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() 호출이 반환 된 후 내가 삽입 한 데이터 (간접적으로)를 실제로 선택할 수 있는지 확인할 수 있습니까?

큰 시스템은 데이터가 즉시 읽을 준비가되지 않았다는 사실을 어떻게 처리합니까?

+0

해당 링크에서 제안한 내용을 시도해 보셨습니까? odp.net 11.1.07.20 및 Oracle 11로 이전하십시오. – tuinstoel

+0

업그레이드 할 수는 있지만 오라클 버전은 제 제어 권한이 없습니다. 비즈니스 계층은 아직 준비가되지 않았기 때문에 조만간 제공 될 예정입니다. –

답변

1

전체 트랜잭션이 준비되었고 트랜잭션 관리자가 커밋 결과를 결정 했으므로 리소스 관리자가 커밋 메시지를 받고 완료되는 것으로 추측합니다 (휴리스틱 손상은 제외됨). 그러나 소요될 수있는 시간에 대한 보장은 없습니다. 시간 제한이 적용되지 않고 자원 관리자 준비에서 "커밋"을 투표 한 은 집합 결과를 듣기 위해 기다려야합니다.

이러한 상황에서 가장 간단한 방법은 "이해가 잘 된 사고 방식"을 취하는 것입니다. 귀하의 요청은 이해되었지만 귀하는 실제로 그 결과를 알지 못합니다. 예, 모든 정상적인 상황에서 요청이 완료되지만 일부 조건에서 운영자는 실제로 거래에 수동으로 개입 할 수 있습니다 (그렇게 할 때 휴리스틱 한 손상을 일으킬 수 있습니다).

한 걸음 더 나아가려면 새 트랜잭션을 수행하고 일부 u 리를 수행하여 데이터가 있는지 확인하십시오. 이제 결과 화면을 채우는 경우 자연스럽게 쿼리와 같은 작업을 수행하게됩니다. 기대되는 결과가 없다면 어떻게해야 할 것인가. 다시 말하지만 사용자에게 "최근 요청이 처리 중이며 새로 고침하여 완료되었는지 확인합니다."라고 알립니다. 또는 자동으로 다시 시도하십시오 (자동 재시도가 거의 필요하지 않습니다. 실제로 비동기 작업임을 사용자에게 알리는 것을 선호합니다).

+0

예. 일반적으로 3 초의 수면은 충분하지만 Commit()보다 실제로 느립니다 (실제로는 수 백 밀리 초 응답). 아마도 WCF 서비스 응답 콜백을 비동기로 만들고 데이터가 준비 될 때까지 절전 모드로 전환해야합니다. –

+1

데이터가 있음을 볼 수 있습니까? COM +를 통해 증가하는 숫자를 삽입하고 ODP.NET을 통해이 숫자를 쿼리 할 수 ​​있습니다. – tuinstoel

+0

Tuinstoel ... 바로 내 다음 브레인 스토밍입니다! 나는 트랜잭션에서 "마커 (marker)"를 추가 할 수 있습니다 - INSERT를 별도로해야만 알 수 있습니다. 내가 그것을 읽을 수있게되면, 전체 트랜잭션의 데이터를 읽을 수 있는지 알 수 있습니까? –

관련 문제