2012-07-07 3 views
0

원격 데이터베이스의 테이블에 대해 동의어를 사용하고 있습니다. 원격 사이트의 응용 프로그램은 원본 테이블에 데이터를 삽입하고 내 응용 프로그램은 테이블의 동의어를 통해 해당 데이터를 읽습니다.테이블에 대한 Oracle 동의어가 경쟁 조건을 유발합니까?

원격 사이트 응용 프로그램은 원본 테이블에 레코드를 삽입 한 후 TCP 메시지를 보냅니다. 내 응용 프로그램은 해당 메시지를받은 페치를 실행합니다. 그러나 TCP 메시지 수신시 테이블 (동의어)에서 사용할 수 없기 때문에 일부 레코드를 가져올 수 없음을 감지합니다.

동의어에 삽입 및 페치 할 때 경쟁 조건이있을 가능성이 있습니까?

+1

소스 응용 프로그램'는 메시지를 보내기 전에 commit'ing이다? 대상 응용 프로그램이 열린 커서를 유지합니까? – Mat

+0

예, 원본 응용 프로그램이 TCP 메시지를 보내기 전에 삽입 SQL을 커밋합니다. 대상 응용 프로그램은 응용 프로그램을 종료 할 때까지 DB 연결을 닫지 않습니다. – Janaka

답변

2

동의어의 존재 여부는 영향을 미치지 않습니다.

알림을 보내기 전에 원본 응용 프로그램이 커밋하고 응용 프로그램이 기본 읽기 커밋 된 트랜잭션 격리 수준을 사용하는 경우 응용 프로그램에 데이터베이스를 쿼리 할 때 커밋 된 모든 행이 표시됩니다. 원격 데이터베이스가 MAX_COMMIT_PROPAGATION_DELAY이 0이 아닌 값으로 설정된 RAC 데이터베이스 인 경우에만 알고있는 유일한 예외입니다. 원격 데이터베이스가 오라클의 이전 버전 (10.2 이전)이 아니라면 누군가가 해당 매개 변수의 기본값을 변경 한 경우에만 해당됩니다.

당신은 당신은 MAX_COMMIT_PROPAGATION_DELAY가 (매개 변수가 설정되어 있지 않은 경우이 0 행을 반환합니다)

select name, value 
    from v$parameter 
where name = 'max_commit_propagation_delay' 
v$parameter를 조회하여 설정되어 있는지 여부를 확인할 수 있습니다 v$version

select * 
    from v$version 

보고 오라클 버전을 확인할 수 있습니다

gv$instance을 쿼리하면 데이터베이스가 다중 노드 RAC 클러스터인지 여부를 확인할 수 있습니다. 이 1보다 큰의 count(*)을 반환하는 경우, 다중 노드 RAC 데이터베이스

select count(*) 
    from gv$instance 
+0

DB에서 어떻게 확인할 수 있습니까? 내가 SQLPLUS를 통해 확인할 수 있습니까 – Janaka

+0

@Janaka - SQL * Plus를 통해 원격 데이터베이스에 연결되었다고 가정하면 'select * from v $ version'은 Oracle의 버전을 제공합니다.'name, value 선택 v $ parameter where name = 'max_commit_propagation_delay' '는 최대 전파 지연 (설정되었다고 가정)과'select count (*) from gv $ instance'를 통해 얼마나 많은 데이터베이스 인스턴스가 있는지를 알려줍니다. 하나는 다중 노드가있는 RAC 데이터베이스입니다. –

+0

내 DB 버전은 "오라클 데이터베이스 11g 엔터프라이즈 에디션 출시 11.2.0.1.0 - 64 비트 생산 PL/SQL 릴리스 11.2.0.1.0 - 생산 CORE \t 11.2.0.1.0 \t 생산 Solaris 용 TNS : 버전 11.2. 0.1.0 - 생산 NLSRTL 버전 11.2.0.1.0 - 생산 "그리고이 DB 버전에는 max_commit_propagation_delay가 없습니다. – Janaka