본문 바로가기
ORACLE/관리

데이터 동시성 관리

by 딘스톤 2023. 9. 22.

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