I. Lock
II. Lock 메커니즘
III. 데이터 동시성
① ROW SHARE
② ROW EXCLUSIVE:
③ SHARE
④ SHARE ROW EXCLUSIVE:
⑤ EXCLUSIVE
IV. DML Lock
V. Enqueue 메커니즘
VI. Lock 충돌
VII. Lock 충돌 유발 원인
① 장기 실행 트랜잭션
② 필요 이상으로 높은 lock 레벨
VIII. Deadlock
I. Lock
• 세션이 데이터를 수정할 수 있도록 하려면 먼저 해당 세션이 수정하고 있는 데이터를 lock 해야 합니다.
• lock이 해제될 때까지 lock 된 데이터를 다른 트랜잭션에서 수정할 수 없도록 lock은 세션에 배타적
데이터 제어를 제공합니다
• 트랜잭션을 통해 개별 데이터 행, 다중 행 또는 전체 테이블까지 lock 할 수 있습니다.
II. Lock 메커니즘
• lock 메커니즘의 목적은 데이터베이스 내에서 최대한의 데이터 동시성을 제공하는 것입니다
• 데이터를 수정하는 트랜잭션은 블록 레벨 또는 테이블 레벨 lock이 아닌 행 레벨 lock을 획득합니다.
•객체에 대한 수정은 전체 데이터베이스 또는 스키마 lock 이 아닌 객체 레벨 lock을 획득합니다.
• 데이터 query에는 lock이 필요하지 않으며 다른 유저가 데이터를 lock 한 경우에도 query가 성공합니다.
• 다중 트랜잭션에서 같은 리소스를 lock 해야 하는 경우 첫 번째로 lock을 요청한 트랜잭션이 lock을 획득합니다.
III. 데이터 동시성
• lock 메커니즘의 기본값은 하위단계의 행 레벨 lock 모드입니다
• 다른 트랜잭션은 서로 간섭하지 않고 같은 테이블 내에서 다른 행을 갱신할 수 있습니다.
• 필요한 경우 더 높은 레벨의 lock을 수동으로 지정할 수 있습니다
• 수동 lock 은 이미 lock을 가지고 있거나 이전에 lock을 요청한 모든 세션이 보유한 lock을 해체할 때까지 대기합니다
• lock 명령은 대기 동작을 제어하는 특수 인수인 NOWAIT를 받아들입니다
• 자동 lock 메커니즘은 대부분의 응용 프로그램에 필요한 데이터 동시성을 제공합니다.
① ROW SHARE
৹ lock 된 테이블에 대한 동시 액세스를 허용하지만 세션이 배타적 액세스를 위해 전체 테이블을 lock 하는 것을 금지합니다.
② ROW EXCLUSIVE
৹ row share와 동일하지만 share 모드에서도 lock 하는 것을 금지합니다.
৹ row exclusive lock은 데이터 갱신, 삽입 또는 삭제 시 자동으로 획득됩니다.
৹ row exclusive lock을 사용하면 여러 번 읽고 한번 쓸 수 있습니다.
③ SHARE
৹ 동시 query는 허용하지만 lock 된 테이블에 대한 갱신은 금지합니다
৹ 테이블에서 인덱스를 생성하려면 share lock이 필요하며 자동으로 요청됩니다.
৹ 인덱스를 온라인에서 생성하려면 인덱스를 작성할 때 row share lock을 사용해야 합니다.
৹ share lock을 사용하면 여러 번 읽을 수 있지만 쓸 수는 없습니다.
৹ 상위 테이블에 대한 Foreign Key 계약 조건이 지정된 하위 테이블이 있는 상위 테이블에서 행을 삭제하거나 갱신할 때
투명하게 사용되기도 합니다.
④ SHARE ROW EXCLUSIVE:
৹ 전체 테이블을 query 하는 데 사용되며 다른 유저가 테이블의 행을 query 하는 것은 허용하지만 해당 테이블을
share 모드에서 lock 하거나 행을 갱신하는 것을 금지합니다.
⑤ EXCLUSIVE
৹ lock 된 테이블에서의 query는 허용하지만 해당 테이블에서 다른 작업은 금지합니다.
৹ 테이블을 삭제하려면 exclusive lock이 필요합니다.
IV. DML Lock
• 각 DML 트랜잭션은 다음 두 개의 Lock을 획득합니다
৹ 갱신 중인 행에 대한 EXCLUSIVE 행 Lock입니다.
৹ ROW EXCLUSIVE (RX) 모드에서 갱신 중인 테이블에 대한 테이블 lock (TM)입니다.
- 변경 작업이 수행될 때 다른 세션에서 전체 테이블을 삭제하거나 truncate 하기 위해 lock 하는 것을 방지합니다.
- 하위 배타적 테이블 lock (SX)이라고도 합니다.
• 테이블에 대한 Row Exclusive Lock 은 DDL이 commit 되지 않은 트랜잭션 도중 딕셔너리 메타 데이터를 변경하지
못하도록 합니다
• 트랜잭션의 전체 실행에서 딕셔너리 무결성 및 읽기 일관성이 유지됩니다.
V. Enqueue 메커니즘
• lock 요청은 자동으로 큐에 저장되고, lock을 보우하는 트랜잭션이 완료되면 대기 중인 다음 세션이 lock을 보유하게 됩니다.
• Enqueque 메커니즘은 lock이 요청된 수서와 요청된 lock 모드를 추적합니다.
• lock을 이미 보우한 세션은 큐의 끝으로 이동하지 않고, 해당 lock의 변환을 요청할 수 있습니다.
• Enqueque 메커니즘의 대기자에는 두 가지 법주가 있습니다
৹ 첫 번째 범주는 공유 소유권 없이 대기하는 대기자와 Lock 레벨을 Escalate 하지 않는 공유 소유권이 있는 대기자입니다.
৹두 번째 범주는 대기자를 변환자라고 하며, 대기한 시간이 적도라도 항상 일반 대기자보다 높은 우선 순의가 부여됩니다.
VI. Lock 충돌
• lock 충돌이 자주 발생하지만 대개 시간이 지나면서 Enqueque 메커니즘으로 해결됩니다
• lock 충돌이 계속 유지된다면 DBA에게 요청하여 lock 충돌을 확인하고 해결할 수 있도록 해야 합니다.
VII. Lock 충돌 유발 원인
① 커밋되지 않은 변경사항
৹ 가장 일반적인 원인으로 데이터 변경 후 커밋을 하지 않아 lock 충돌이 발생합니다.
② 장기 실행 트랜잭션
৹ lock 충돌은 트랜잭션과 일괄처리가 동시에 수행될 때 일반적으로 발생합니다.
③ 필요 이상으로 높은 lock 레벨
৹ 일부 데이터베이스에서는 행 레벨 lock을 지원하지 않아 다양한 데이터베이스에서 실행 가능한 응용 프로그램을 작성하는
개발자는 오라클 데이터베이스가 다른 데이터베이스와 유사하게 작동하도록 인위적으로 높은 lock 레벨을 사용하여 응용
프로그램을 작성하기도 합니다
৹ Oracle을 처음 사용하는 개발자들은 오라클 데이터베이스에서 필요한 것보다 더 높은 lock 레벨로 코딩작업을 수행하는
경우가 있습니다.
VIII. Deadlock
• Deadlock은 lock 충돌의 특별한 예로 둘 이상의 세션이 각각 lock 된 데이터를 서로 대기하고 있을 때 발생합니다
• 각 세션이 다른 세션을 대기하고 있기 때문에 어떤 세션도 트랜잭션을 완료하여 충돌을 해결할 수 없습니다.
• 오라클 데이터베이스는 Deadlock을 자동을 감지하여 오류가 발생한 명령문을 종료합니다
• Deadlock에 대한 적절한 응답은 커밋 또는 롤백이며, 다른 세션에서 트랜잭션을 계속 진행할 수 있도록 해당 세션에서
다른 lock을 해제합니다.
'ORACLE > 관리' 카테고리의 다른 글
데이터베이스 유지 관리 (0) | 2023.10.04 |
---|---|
오라클 데이터베이스 감사(audit) (0) | 2023.10.02 |
언두 데이터 관리 (1) | 2023.10.02 |
유저 보안 관리 (0) | 2023.09.21 |
데이터베이스 저장 영역 구조 관리 (0) | 2023.09.19 |