Oracle은 하나의 테이블에 대해 여러 개의 동시 INSERT를 처리하는 방법


8

Oracle 11g를 조금 더 자세히 이해하려고합니다. 제 질문은 간단합니다. 오라클은 단일 테이블에 동시에 레코드를 삽입하려는 두 세션을 어떻게 처리합니까?

예를 들어, INSERT A는 표 1에 대해 오후 1시에 실행됩니다. 완료하는 데 5 분이 걸립니다. INSERT B는 표 1에 대해 오후 1시 2 분에 실행됩니다. 완료하는 데 1 분이 걸립니다.

무슨 일이 일어날 것? INSERT A가 완료된 후 Oracle 큐 INSERT B가 실행됩니까? INSERT B가 INSERT A와 동시에 실행됩니까?

감사!


6
아무것도 :-)보고 스스로를 시도 없잖아
잭 topanswers.xyz 시도라고

물론. 그러나 의도적으로 완료하는 데 5 분이 걸리는 쿼리를 만드는 방법을 잘 모르겠습니다.
더스틴

3
많은 데이터를 삽입 하시겠습니까? insert into foo(id) select level from dual connect by level<1000000(가 느린 정도가 될 때까지 한 번에 제로 하나의 수를 증가)
잭 topanswers.xyz 시도라고

답변:


4

인서트는 고유 또는 기본 키 제약 조건과 충돌하지 않는 한 서로 영향을 미치지 않습니다. 독립적이어야합니다. 이 동시성 문제는 Oracle의 시퀀스가 ​​별도의 객체 (캐시 된, 대리 PK 생성이 삽입과 분리 된) 이유 중 하나라고 생각합니다.

그런 점에서, 그들은 세션에서 볼 때 커밋되지 않은 테이블에서 작동합니다. 이 동작은 아래 stackoverflow 게시물에 설명되어 있습니다.

/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle


2

아마도 Oracle Transaction Management (Concepts) 또는 애플리케이션 개발자를위한 SQL 프로세싱 (Advanced Application Developer 's Guide)을 살펴 보는 것이 도움이 될 것입니다

sqlplus, settitng autocommit으로 세션을 열어서 oracle의 동작을 조사 할 수 있습니다.

자동 커밋을 해제

삽입 실행

테이블에 삽입 (...) 값 (...);

이 세션을 열어두고 다른 창에서 sqlplus 세션을 시작하고 autocommit을 off로 설정하고 다른 삽입을 실행하십시오. 커밋 (또는 롤백)으로 트랜잭션을 닫을 때까지 두 트랜잭션이 모두 활성화됩니다.

대부분의 경우 자동 커밋을 해제 할 필요는 없습니다. 자동 커밋을 해제하지 않은 경우 sqlplkus의 기본값이기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.