ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DB - 동시성 제어와 lock
    Database 2022. 4. 17. 01:43

    Transaction??

    transaction(트랜잭션)이란 Database Managemet System에서 데이터를 다루는 논리적인 작업의 단위를 나타낸다.

    데이터베이스에 삽입, 수정 등의 작업을 할 때, 여러 개의 작업들을 하나의 transaction으로 묶는다.

    예를 들어, A 계좌에서 B 계좌로 돈을 전송한다고 할 때, A 계좌에서 돈을 빼는 작업과 B 계좌에 돈을 넣는 작업이 이루어지게 된다. 이 두 가지의 작업(2개의 SQL 문)을 개별적으로 수행하는 것이 아니라 하나의 트랜잭션으로 묶는다. 그리고 묶인 트랜잭션안에 작업들 중 몇 개만 실행되는 상황은 발생하지 않기 때문에 All or nothing이라 하고 트랜잭션의 성질중 Atomicity를 나타낸다.

     

    동시성 제어(concurrency control)

    동시성 제어란, 여러 사용자가 있는 환경에서 둘 이상의 트랜잭션이 동시에 수행될 때, 데이터의 일관성을 해치지 않도록 하는 제어법이다. 

     

    동시성 제어의 목적

    • 트랜잭션의 직렬성 보장
    • 공유도 극대화, 응답 시간 최소화, 시스템 활용의 극대화
    • 데이터의 무결성과 일관성 보장

     

    동시성 제어가 없을 경우

    • 갱신 손실(lost update)
      • 하나의 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어써서 갱신이 무효화 됨
      • 두 개 이상의 트랜잭션이 한 개의 데이터를 동시에 갱신할 때 발생함
    • 현황파악오류(dirty read)
      • 읽기 작업을 하는 트랜잭션이, 쓰기 작업을 하는 트랜잭션의 중간 데이터를 읽으면 문제가 발생할 수 있음
      • 작업중인 트랜잭션이 작업을 롤백(rollback)한 경우, 다른 트랜잭션이 무효화된 데이터를 읽게 될 수 있음
    • 모순성(inconsistency)
      • 어떤 트랜잭션이 데이터를 갱신하는 동안 다른 두 트랜잭션 중 하나는 갱신되기 전의 값을 익고 다른 하나가 갱신된 후의 값을 읽게 되어 불일치하는 경우
    • 연쇄복귀(cascading rollback)
      • 두 트랜잭션이 동일한 데이터 내용을 접근할 때 발생
      • 한 트랜잭션이 데이터를 갱신하다 실패하여 rollback하는 과정에서 다른 트랜잭션이 갱신과 rollback 연산을 실행하고 있던 데이터를 읽어서 사용하는 경우 문제 발생

     

    락(lock)

    locking이란 트랜잭션들이 같은 데이터에 대해 동시에 접근하지 못하도록 제어하는 것을 말한다. 

    어떤 트랜잭션이 데이터에 Read나 Write 연산을 수행하려면 반드시 lock을 해주어야한다. 또 수행이 끝나면 unlock을 해주어야 한다. 이미 lock이 걸려있는 데이터에 대해서는 다시 lock을 걸 수 없고, 당연히 lock을 걸지 않았으면 unlock 할 수 도 없다.

     

    • 공유락 (shared lock)
      • 트랜잭션은 데이터에 대해 읽을 수 있지만 쓸 수는 없다.
      • Read는 서로 영향을 주지 않기 때문에 서로 다른 트랜잭션이 같은 데이터에 대해 동시에 shared lock을 설정할 수 있다.

     

    • 배타락(exclusive lock)
      • 한 트랜잭션이 어떤 데이터에 대해 배타락을 건 경우, 그 트랜잭션은 해당 데이터를 읽고 쓸 수 있다.
      • 단, Write는 다른 트랜잭션에 영향을 주는 작업이기 때문에 다른 트랜잭션은 배타락이 걸린 데이터에 어떤 락도 걸 수 없다.
      • 트랜잭션이 락을 허용받지 못하면 대기 상태가 된다.

     

    데드락(Deadlock, 교착 상태)

    Deadlock???

    교착상태란 두 개 이상의 트랜잭션이 특정 데이터(테이블, 행)에 대해 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 말한다. 즉, 두 트랜잭션이 각각 lock을 설정하고, 서로의 lock에 접근하여 값을 얻어오려고 할 때, 서로의 lock으로 인해 양쪽 트랜잭션이 영원히 처리되지 않는 상태이다.

     

    데드락 감지 기법(deadlock detection)

    wait-for-graph 기법은 교착상태를 감지하는 기법 중에 하나다. 이 기법은 트랜잭션과 lock을 기반으로 그래프를 그린다. 그려진 그래프가 닫힌 루프 형태이거나 사이클을 이루면 교착상태에 빠졌음을 알 수 있다. 작은 데이터베이스에 이 기법이 적합하다.

    데드락 회피 기법

    데이터베이스가 교착상태에 빠지면, 데이터베이스를 종료하거나 재시작하는 것보다 회피하는 것이 낫다. 이 회피 기법은 사이즈가 작은 데이터베이스에 적합하다.

    회피 방법 중 하나는 application-consistent logic을 사용하는 것이다. 위에 그림을 예시로 봤을때, student와 grade를 접근하는 트랜잭션은 항상 테이블에 같은 순서로 접근하도록 하는 것이다. 그러면 T1은 T2가 grade에 대한 lock을 놓기를 기다렸다가 T2가 놓으면 T1이 트랜잭션을 수행하는 것이다.

    또 다른 방식은 row-level locking mechanism과 READ COMMITTED isolation level을 동시에 사용하는 것이다. 하지만 이것은 완벽하게 교착상태를 없앤다고 보장할 수 없다.

     

    READ COMMITTED : 읽는 시점의 data가 committed 된 것임을 보장한다. dirty read를 허용하지 않는다는 뜻이다. 

     

    데드락 예방 기법

    • wait-die 방식 
      • 트랜잭션 A가 B에 의해 lock된 데이터를 요청할 때, DBMS는 두 트랜잭션의 timestamp를 확인하여 더 오래된 트랜잭션은 기다리게 해준다. 즉 B에 의해 lock된 데이터를 A가 기다리고 있고 A가 B보다 더 오래됐다면, B는 killed 되지 않고 기다릴 수 있다. 하지만 B가 점유하고 있는 데이터를 A가 기다리고 있고 A가 B보다 오래되지 않았으면 A는 kill된다. 그리고 랜덤한 delay 이후에 동일 timestamp로 재시도한다. 
    • wound-wait 방식
      • 트랜잭션 A가 데이터를 점유하고 있고 B가 그 데이터를 요구하는 시점에서, A보다 B가 더 오래된 트랜잭션이라면 A를 강제로 kill하고 자원을 놓게 한다. 그리고 A는 나중에 동일한 timestamp를 가지고 재시도한다. 반면에 B가 더 최근 트랜잭션이라면 A의 점유가 끝날때까지 기다린다.

    출처 - https://www.geeksforgeeks.org/deadlock-in-dbms/

     

    'Database' 카테고리의 다른 글

    DB - 트랜잭션 관리  (0) 2022.04.23
JackCokebb dev blog