Oracle이 DML 문을 수행하는 동안 전체 테이블을 잠글 것인지 아니면 행만 잠글 것인지 여부
데이터베이스 테이블에 무언가를 삽입/업데이트하려고 할 때 Oracle은 전체 테이블을 잠글 것입니까, 아니면 삽입/업데이트 중인 행만 잠글 것입니까?
이것은 외부 구성을 통해 제어할 수 있는 것입니까?
LOCK TABLE 명령을 사용하여 잠금을 명시적으로 실행할 수 있습니다.자세히 보기
그렇지 않으면 삽입이 다른 행을 잠그지 않습니다.Oracle의 읽기 격리 모델로 인해 행은 커밋할 때까지 세션에만 존재하므로 다른 사람이 아무것도 할 수 없습니다.자세히 알아보세요.
업데이트 문은 영향을 받는 행만 잠급니다.우리가 SELECT... FOR UPDATE로 비관적인 잠금 전략을 실행하지 않는 한.자세히 알아보세요.
마지막으로 오라클에서 작성자는 판독기를 차단하지 않습니다.따라서 잠긴 행도 다른 세션에서 읽을 수 있지만 변경할 수 없습니다.자세히 알아보세요.
이 동작은 Oracle 커널에 구워지며 구성할 수 없습니다.
Justin은 테이블 레벨 DDL 잠금에 대해 좋은 지적을 합니다.DDL이 CREATE INDEX와 같은 경우 ORA-00054에서 즉시 실패하지 않는 한 테이블에서 DDL을 실행하는 세션은 DML 세션이 커밋될 때까지 기다립니다.
"잠금"이 무엇을 의미하는지에 따라 다릅니다.
사람들이 관심을 가질 가능성이 높은 99.9%에 대해 Oracle은 행을 수정할 때 행 수준 잠금을 획득합니다.행 수준 잠금은 여전히 판독기가 행을 읽을 수 있도록 허용합니다(다중 버전 읽기 일관성 때문에 작성자는 판독기를 차단하지 않으며 판독기는 더티 읽기를 수행하지 않습니다).
이리저리 쑤시면.v$lock행을 업데이트하면 테이블의 잠금도 해제되는 것을 볼 수 있습니다.그러나 이 잠금은 다른 세션이 테이블에서 DDL을 수행하는 것을 방지할 뿐입니다.애초에 활성 테이블에서 DDL을 수행하는 것은 사실상 불가능하기 때문에 일반적으로 다른 세션에서 잠금을 기다리는 것은 아닙니다.
일반 DML이 실행되면(UPDATE/DELETE/INSERT, MERGE 및 SELECT ... FOR UPDATE) oracle은 2개의 잠금을 얻습니다.행 수준 잠금(TX) - 해당 행을 이미 소유한 트랜잭션이 완료될 때까지 특정 행을 누르고 동일한 행을 수정하려는 다른 트랜잭션이 차단됩니다.Table Level Lock(TM) - Row Lock(TX)을 획득하면 DML이 진행되는 동안 DDL 작업이 발생하지 않도록 Table Lock도 추가로 획득됩니다.
그러나 중요한 것은 테이블 잠금이 어떤 모드에서 획득되는지입니다.하위 공유 테이블 잠금(SS)이라고도 하는 행 공유 잠금(RS)은 테이블의 잠금을 유지하는 트랜잭션에 테이블의 행이 잠겨 있으며 이를 업데이트하려고 함을 나타냅니다.SS 잠금은 테이블 잠금의 가장 제한이 적은 모드로, 테이블에 대해 가장 높은 수준의 동시성을 제공합니다.
하위 배타적 테이블 잠금(SX)이라고도 하는 행 배타적 잠금(RX)은 잠금을 유지하는 트랜잭션에 업데이트된 테이블 행이 있거나 SELECT...FOR UPDATE가 실행되었음을 나타냅니다.SX 잠금을 사용하면 다른 트랜잭션에서 동일한 테이블의 행을 동시에 쿼리, 삽입, 업데이트, 삭제 또는 잠글 수 있습니다.따라서 SX 잠금을 사용하면 여러 트랜잭션에서 동일한 테이블에 대한 SX 및 SS 잠금을 동시에 얻을 수 있습니다.
한 트랜잭션이 보유한 공유 테이블 잠금(S)을 사용하면 다른 트랜잭션이 테이블을 쿼리할 수 있지만(SELECT ... FOR UPDATE를 사용하지 않음) 단일 트랜잭션이 공유 테이블 잠금을 보유한 경우에만 업데이트를 허용합니다.여러 트랜잭션이 동시에 공유 테이블 잠금을 유지할 수 있으므로 이 잠금을 유지하는 것만으로는 트랜잭션이 테이블을 수정할 수 없습니다.
SRX(Share Row Exclusive Table Lock)는 SSX(Share-Subexclusive Table Lock)라고도 하며 공유 테이블 잠금보다 더 제한적입니다.지정된 테이블에서 한 번에 하나의 트랜잭션만 SSX 잠금을 획득할 수 있습니다.트랜잭션이 보유한 SSX 잠금을 사용하면 다른 트랜잭션이 테이블을 쿼리할 수 있지만(SELECT ... FOR UPDATE 제외) 테이블은 업데이트할 수 없습니다.
배타적 테이블 잠금(X)은 테이블 잠금의 가장 제한적인 모드로, 잠금을 유지하는 트랜잭션에서 테이블에 대한 배타적 쓰기 액세스를 허용합니다.테이블에 대해 하나의 트랜잭션만 X 잠금을 얻을 수 있습니다.
당신은 아마도 잠금에 관한 오라클 개념 설명서를 읽어야 할 것입니다.표준 DML 작업(삽입, 업데이트, 삭제, 병합)의 경우 Oracle은 공유 DML(TM 유형) 잠금을 사용합니다.이렇게 하면 테이블의 다른 DML이 동시에 발생할 수 있습니다(공유 잠금).DML 업데이트 또는 삭제 작업으로 수정되었지만 아직 커밋되지 않은 행에는 전용 행 잠금(TX 유형)이 있습니다.다른 세션/트랜잭션의 다른 DML 작업은 테이블에서 작동할 수 있지만 동일한 행을 수정할 경우 행 잠금 소유자가 커밋하거나 롤백하여 해제할 때까지 차단됩니다.
병렬 DML 작업 및 직렬 삽입 직접 로드 작업은 전용 테이블 잠금을 사용합니다.
언급URL : https://stackoverflow.com/questions/18021447/will-oracle-lock-the-whole-table-while-performing-a-dml-statement-or-just-the-ro
'IT' 카테고리의 다른 글
| JNI를 통해 Java의 바이트[]를 C의 함수에 전달: jarraybyte 사용 방법 (0) | 2023.08.01 |
|---|---|
| $.when.apply($, 일부 어레이)의 역할은 무엇입니까? (0) | 2023.08.01 |
| 고유하지 않은 인덱스를 고유한 인덱스로 변경 (0) | 2023.08.01 |
| 코드를 사용하여 장치 화면 크기 범주(소, 일반, 대, xlarge)를 결정하는 방법은 무엇입니까? (0) | 2023.08.01 |
| SQLite 파일 위치 핵심 데이터 (0) | 2023.08.01 |