ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Database Lock
    STUDY/DB 2023. 4. 26. 00:06

     

    Database Lock이란?

     

    Lock은 여러 트랜잭션이 공유 데이터에 접근할 때 데이터를 잘못 업데이터하거나 잘못된 데이터 구조를 변경하는 것을 방지하는 것으로 데이터베이스 동시성과 일관성을 유지하는 데 중요한 역할을 한다.

     

    일반적으로 데이터베이스는 베타적 락(Exclusive Locks)과 공유 락(Share Locks) 두 종류의 락을 사용하는데, 하나의 리소스(행 또는 테이블)에는 하나의 베타적 락만 획득할 수 있고, 여러 개의 공유 락을 동시에 획득할 수 있다.

     

     

    Lock의 설정 범위(Level)

     

    데이터베이스

    • 데이터베이스 범위의 Lock은 전체 데이터베이스를 기준으로 Lock을 하는 것을 의미한다. 즉, 1개의 세션만이 DB의 데이터에 접근이 가능하다.

     

    파일

    • 데이터베이스 파일을 기준으로 Lock을 설정한다. 파일이란 테이블, row등과 같은 실제 데이터가 쓰여지는 물리적인 저장소를 의미한다. 

     

    테이블

    • 테이블 수준의 Lock은 테이블을 기준으로 Lock을 설정한다. 이는 테이블의 모든 행을 업데이트하는 등의 전체 테이블에 영향을 주는 변경을 수행할 때 유용하다. 즉 DDL(CREATE, ALTER, DROP) 구문과 함께 사용되며 DDL Lock이라고도 한다.

     

    페이지와 블록

    • 파일의 일부인 페이지와 블록을 기준으로 Lock을 설정한다.

     

    컬럼

    • 컬럼을 기준으로 Lock을 설정한다. Lock 설정 및 해제의 리소스가 많이 들기 때문에 일반적으로 사용되지 않는다.

     

    • 1개의 행(ROW)를 기준으로 Lock을 설정한다. DML에 대한 Lock으로 가장 일반적으로 사용하는 Lock이다.

     

     

    Lock 종류

     

    Shared Locks(공유 락)

    • 데이터를 변경하지 않는 읽기 명령에 대해 주어지는 락으로 Read Lock이라고도 한다.
    • 여러 사용자가 동시에 데이터를 읽어도 데이터 일관성에 영향을 주지 않기 때문에, 공유 락끼리는 동시 접근이 가능하다.
    • Shared Lock이 적용된 데이터는 수정할 수 없으며(베타 락 불가능), 수정하려면 해당 락이 해제될 때까지 기다려야 한다.

     

    Exclusive Locks(베타적 락)

    • 데이터에 변경을 가하는 명령들에 대해 주어지는 락으로 Write Lock으로 불린다.
    • 트랜잭션에 데이터 수정 권한을 부여하며, 베타 락은 트랜잭션 동안 유지된다.
    • Exclusive Lock이 적용된 데이터에 다른 트랜잭션은 접근할 수 없으며, 해당 락이 해제될 때까지 기다려야 한다.

     

    Update Locks(업데이트 락) 

    • 데이터를 수정하기 위해 베타 락을 걸기 전, 데드 락 방지를 위해 사용되는 락이다.
    • 일반적으로 UPDATE 쿼리의 WHERE가 실행되는 과정에서 적용된다.
    • 서로 다른 트랜잭션에서 동일한 자원에 대해 읽기 쿼리 이후, 업데이트 쿼리를 적용하는 경우 conversion deadlock이 발생하는데, 이를 막기 위해 WITH(UPDLOCK)을 적용해서 사용하기도 한다.

     

    Intent Locks(내재 락)

    • 사용자가 요청한 범위에 대한 락(ex. 테이블 락)을 걸 수 있는 지 여부를 빠르게 파악하기 위해 사용되는 락이다.
    • Intent Locks의 종류에는 Intent Shared Locks, Intent Exclusive Locks, Intent Update Locks 등이 있다.
    • 트랜잭션 A가 테이블의 하나의 ROW에 대해 베타 락을 건 경우, 트랜잭션 B사 테이블 전체에 락을 걸기 위해서는 트랜잭션 A의 작업이 끝날 때까지 기다려야 한다. 이때, 트랜잭션 B가 테이블에 락을 걸 수 있는지 파악하기 위해 테이블에 존재하는 모든 로우와 관련된 락을 찾는 것은 비효율적이다. 따라서, 데이터베이스는 트랜잭션 A가 로우에 베타 락을 거는 시점에, 해당 로우의 상위 객체들(ex. 테이블)에 대한 내재 락을 걸어서, 다른 트랜잭션이 더 큰 범위에 대한 락을 걸 수 있는지 여부를 빠르게 파악할 수 있도록 한다.

     

     

    Oracle Database Lock 동작

     

    • 행은 writer에 의해 수정될 때만 락이 걸린다.

    하나의 문장이 한 행을 업데이트할 때, 해당 행에 대한 락만 획득한다. 행 수준에서 테이블 데이터를 락으로 관리하여 같은 데이터에 대한 경합을 최소화한다. 일반적으로 데이터베이스는 행 락을 블록 또는 테이블 레벨로 승격하지 않는다.

     

    • 행의 writer는 같은 행을 동시에 수정하는 다른 트랜잭션의 writer를 대기시킨다.

    하나의 트랜잭션이 행을 수정하고 있으면, 해당 행에 대한 락이 다른 트랜잭션이 동시에 해당 행을 수정하는 것을 방지한다.

     

    • reader는 writer를 대기상태(Block)로 만들지 않는다.

    행을 조회하는 reader는 해당 행을 락으로 잡지 않으므로 writer는 해당 행을 수정할 수 있다. 하지만 SELECT ... FOR UPDATE문은 예외이며, 이것은 읽는 행을 락으로 잡는 특수한 SELECT문이다.

     

    • writer는 reader를 대기상태(Block)로 만들지 않는다.

    행을 writer가 변경하고 있을 때, 데이터베이스는 reader에게 행의 일관된 결과를 제공하기 위해 undo 데이터를 사용한다.

     

    Blocking

    트랜션이 획득한 락으로 인해 다른 트랜잭션이 해당 락을 획득하지 못하고 대기하게 되는 상태를 의미한다. 공유락끼리는 블로킹이 발생하지 않지만, 베타락의 경우 블로킹이 발생한다. 블로킹을 해소하기 위해서는 이전 트랜잭선이 완료(커밋 or 롤백) 되어야 한다. 
    DeadLock

    서로 다른 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 데이터를 얻으려고 할 때 이미 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 처리되지 않게 되는 상태를 말한다. 교착상태가 발생할 경우 DBMS는 둘 중 한 트랜잭션에 에러를 발생시킴으로써 문제를 해결한다.

    Conversion DeadLock

    공유락과 업데이트 락이 동일한 자원에 접근하는 것을 허용하는 공유 락의 성질에서 기인한다. 데이터베이스는 업데이트를 실행할 때, 먼저 해당 자원에 대한 공유 락을 얻어온 후 이를 베타 락으로 전환한다. 두 개의 트랜잭션에서 업데이트 쿼리가 동시에 실행되어, 모두 공유락을 얻은 후 이를 베타 락으로 전환하려 할 때, 상대 트랜잭션이 소유하고 있는 공유 락으로 인해 모든 트랜잭션이 베타 락을 얻지 못 해 업데이트에 실패하게 된다.

    https://metalzang.tistory.com/143
    Undo Data

    Oracle 데이터베이스에서 트랜잭션 처리를 위해 사용되는 임시 저장소로, 트랜잭션에서 수행한 모든 변경 작업은 해당 트랜잭션의 undo 데이터에 기록된다. 즉, 트랜잭션이 커밋되기 전에 undo 데이터는 로그에 기록되고 디스크에 저장된다.

    Undo 데이터는 데이터베이스의 일관성과 복구 기능을 보장하기 위해 사용된다. 트랜잭션에서 롤백을 수행하거나, 데이터를 복구해야 하는 경우에 undo 데이터를 사용하여 이전 상태로 되돌릴 수 있다.
    또한, Undo 데이터는 데이터베이스에서 read consustency(일관된 조회)를 보장하는 데 사용된다. 트랜잭션이 일관성 있는 데이터를 조회하기 위해서는 해당 조회 시점에서의 데이터 상태를 보장해야 한다. 이를 위해 데이터베이스는 해당 시점의 undo 데이터를 사용하여 일관성 있는 조회를 보장한다.

     

     

     

    참고

    https://sewonzzang.tistory.com/76

    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/data-concurrency-and-consistency.html#GUID-2309ED19-A551-46DA-9E58-D957A22F9D6C

    'STUDY > DB' 카테고리의 다른 글

    DBCP(Database Connection Pool)  (0) 2023.05.17
    Spring Transactional  (0) 2023.05.10
    Isolation Level  (0) 2023.04.25
    실행계획  (0) 2023.04.19
    Join 방식  (0) 2023.04.13
Designed by Tistory.