문제

Oracle의 폭풍 백엔드에서 장치 테스트를 실행하는 임무를 수행하여 백엔드가 생산에 사용하기에 충분한 품질인지 확인할 수 있습니다. 제가 실행중인 한 가지 문제는 직렬화 가능한 모드로 연결하면 ORA-08177 (이 트랜잭션에 대한 액세스를 직렬화 할 수 없음)을 받고 있다는 것입니다. Read Commited Mode를 사용하면 문제가 사라집니다.

이제 읽었습니다 이것은 톰에게 물어보세요 기사와 이것은 기본적으로 동시성 문제임을 나타냅니다.

데이터베이스에 연결하는 스레드가 하나만 있다고 가정하고 세계의 다른 사람 이이 데이터베이스에 연결하고 있다고 가정하면이 오류를 얻을 수 있습니까? 그렇다면 누군가 나 에게이 오류를 생성하는 예제 쿼리를 제공 할 수 있습니까?

아니면 커서 또는 연결이 어딘가에 닫히지 않을 가능성이 있습니까? 아니면 거래가 커밋되거나 롤백되지 않습니까?

도움이 되었습니까?

해결책

"거기 ~이다 관련된 트리거이지만 업데이트 나 삽입물이 아닌 DDL 문에 오류가 발생합니다. "

DDL 진술은 자신의 커밋을 처리해야합니다. 기본적으로 그들은 커밋을 수행 한 다음 메타 데이터가 변경 (여러 기본 객체를 포함 할 수 있음)을 변경 한 다음 다시 커밋 (DDL이 성공한다고 가정합니다. 실패하면 변경이 롤백되어야 함).

따라서 DDL을 수행하는 경우 커밋이 안전하고, 거래를 변경하여 Committed를 읽고, DDL을 수행 한 다음 거래를 직렬화 가능한 것으로 다시 변경해야합니다. 완전한 테스트 케이스 (또는 적어도 당신이 말하는 DDL)를 줄 수 있다면 도움이 될 수 있습니다. 예를 들어, 선택된 뷰 생성 또는 생성 테이블은 예를 들어 DDL (독특한 커밋) + DML이므로 '홀수'일 수 있습니다.

다른 팁

한 세션 만 있으면이 오류가 발생하지 않아야합니다. 그러나 다음 스크립트는 첫 번째 세션과 독립적으로 행을 업데이트하는 보조 세션을 스폰하여 ORA-8177을 트리거 할 수 있습니다. 이것이 당신이 원하는지 확실하지 않습니다.

고려하다:

SQL> alter session set isolation_level=serializable;

Session altered
SQL> create table test (a number);

Table created
SQL> insert into test values (1);

1 row inserted
SQL> commit;

Commit complete
SQL> declare
  2     pragma autonomous_transaction;
  3  begin
  4     update test set a = 2;
  5     commit;
  6  end;
  7  /

PL/SQL procedure successfully completed
SQL> update test set a = 3;

update test set a = 3

ORA-08177: can't serialize access for this transaction
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top