Oracle의 Insert는 테이블을 잠급니다. Oracle이 insert와 같은 DML 문을 실행할 때 두 개의 insert 문이 동시에 테이블에 대해 작업을 시도하면 세션이 종료됩니다. 다른 세션이 커밋되거나 롤백되어 교착 상태가 발생합니다.
이 튜토리얼의 운영 환경: Windows 10 시스템, Oracle 11g 버전, Dell G3 컴퓨터.
Oracle lock the table
ORACLE이 insert 등의 DML 문을 실행할 때 먼저 자동으로 해당 테이블에 TM 잠금을 적용합니다. TM 잠금을 획득한 후 자동으로 TX 유형 잠금을 신청합니다. 두 개 이상의 세션이 테이블의 동일한 레코드에 대해 DML 언어를 실행하는 경우 첫 번째 세션은 해당 레코드를 잠그고, 다른 세션은 첫 번째 세션이 커밋된 후 TX 잠금이 해제될 때까지 대기 상태가 되며, 나머지 세션만 잠글 수 있습니다.
두 개의 insert 문이 동일한 PK 또는 고유 값을 가진 데이터를 동시에 테이블에 삽입하려고 시도하여 세션이 차단되고 다른 세션이 커밋 또는 롤백되기를 기다리므로 교착 상태가 발생하기 때문입니다.
이 경우 세션 중 하나가 제출되면 다른 하나는 ORA-00001을 보고합니다. 고유 제약 조건이 위반되어 교착 상태가 종료되거나 세션 중 하나가 롤백되고 다른 하나는 정상적으로 실행될 수 있습니다. .
오라클에서 테이블을 잠그는 이유는 프로그램이 테이블에 삽입을 수행하고 아직 커밋되지 않은 경우 다른 프로그램도 동일한 테이블에 삽입을 수행하면 리소스 사용 예외가 발생하기 때문입니다. , 테이블 잠금.
테이블을 잠그는 주요 이유는 다음과 같습니다.
(1) 프로그램 A는 tableA의 삽입을 실행하고 커밋 전에 프로그램 B도 tableA를 삽입합니다. 이때 리소스 사용 중 예외가 발생합니다. . Table
(2) 테이블 잠금은 병렬이 아닌 동시성으로 발생하는 경우가 많습니다(병렬에서는 한 스레드가 데이터베이스를 작동하면 다른 스레드는 데이터베이스, CPU 및 I/O 할당 원칙을 작동할 수 없음)
확률을 줄이는 방법 of table locking :
(1) insert, update, delete 문 실행과 커밋 사이의 시간을 줄입니다. 구체적으로 일괄 실행을 단일 실행으로 변경하여 SQL 자체의 비실행 속도를 최적화합니다
(2) 트랜잭션이 비정상적으로 롤백되는 경우
테이블을 잠그는 이유는 행 데이터가 수정되어 행 데이터를 제출하는 것을 잊었으며 이로 인해 테이블도 잠기게 됩니다.
지식 확장:
결정을 내리기 전에 이유를 확인하는 것이 좋습니다.
1 테이블 잠금 쿼리의 코드 형식은 다음과 같습니다.
select count(*) from v$locked_object; select * from v$locked_object;
2. 어떤 테이블이 잠겨 있는지 확인하세요.
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
3 어떤 세션이 잠겼는지 확인하세요.
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
추천 튜토리얼: "Oracle Video Tutorial"
위 내용은 Oracle에 삽입하면 테이블이 잠길까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!