ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜잭션 - 동시성 제어
    데이터베이스 2021. 8. 10. 15:46
    💡
    트랜잭션이 동시에 수행될 때, 일관성을 해치지 않도록 트랜잭션의 데이터 접근을 제어하는 DBMS의 기능을 동시성 제어라고 합니다.

    트랜잭션을 수행할 때, 한 트랜잭션이 끝난 다음 다음 트랜잭션을 수행시킨다면 데이터베이스의 일관성을 유지할 수 있습니다. 하지만 데이터베이스는 가능한 많은 트랜잭션을 동시에 수행시켜야 합니다.

    2개 이상의 트랜잭션이 같은 테이블에 동시에 접근하게 되면 여러 문제가 발생할 수 있습니다.

    2개의 트랜잭션이 읽기만 하는 경우는 문제가 발생하지 않지만, 쓰기 작업을 할 경우 오손 읽기, 반복 불가능 읽기, 유령 데이터 읽기, 갱신 손실 등의 문제가 발생합니다.

    1️⃣ 갱신손실

    💡
    갱신손실 문제는 두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신할 때 발생합니다.

    초기값 X = 1000원이 있고, 트랜잭션 T1은 100원 인출을, 트랜잭션 T2는 100원 입금을 하였으므로 그대로 1000원이 남아있어야 하지만 트랜잭션 T2가 트랜잭션 T1의 작업을 무효화시켰기 때문에 최종 결과값은 1100원이 되었습니다.

    이렇게 T1과 T2가 순차적으로 값을 저장하여 덮어씌워지는 값의 손실을 갱신손실이라고 합니다.

    2️⃣ 락

    💡
    갱신손실 문제를 해결하려면 상대방 트랜잭션이 데이터를 사용하는지 여부를 알 수 있는 규칙이 필요합니다. 은 트랜잭션이 데이터를 읽거나 수정할 때 데이터에 표시하는 잠금 장치입니다.

    트랜잭션 T1이 X에 락을 설정하였기 때문에, T2는 자신이 원하는 락을 얻지 못하고 대기상태가 됩니다. T2는 T1이 X의 락을 해지한 다음에 진행할 수 있습니다. 을 사용하면 데이터 X에 대한 갱신을 순차적으로 진행할 수 있기 때문에 갱신손실 문제를 해결할 수 있습니다.

    락의 유형

    락은 트랜잭션이 읽기를 할 때 사용하는 공유 락(LS)과, 읽기/쓰기를 할 때 사용하는 배타 락(LX)으로 나뉩니다.

    공유락과 배타락을 사용하는 규칙

    • 데이터에 락이 걸려있지 않다면 트랜잭션은 데이터에 락을 걸 수 있습니다
    • 트랜잭션이 데이터 X를 읽기만 할 경우 공유 락을 요청하고, 읽거나 쓰기를 할 경우 배타 락을 요청합니다
    • 다른 트랜잭션이 데이터에 공유 락을 걸어두면, 공유락의 요청은 허용하고 배타 락은 허용하지 않습니다
    • 다른 트랜잭션이 데이터에 배타 락을 걸어두면, 공유 락과 배타 락 모두 허용하지 않습니다
    • 트랜잭션이 락을 허용받지 못하면 대기 상태가 됩니다.

    2단계 락킹

    락을 사용하면 갱신손실 문제를 해결할 수 있습니다. 하지만 락을 걸고 해제하는 시점에 제한을 두지 않으면 두 개의 트랜잭션이 동시에 실행될 때 데이터의 일관성이 깨질 수 있습니다. 이것을 방지하기 위해 2단계 락킹 기법을 사용합니다.

    확장 단계

    트랜잭션이 필요한 락을 획득하는 단계로, 이 단계에서는 이미 획득한 락을 해제하지 않습니다

    수축 단계

    트랜잭션이 락을 해제하는 단계로, 이 단계에서는 새로운 락을 획득하지 않습니다.

    2단계 락킹을 사용하지 않은 경우

    트랜잭션 T1은 A에서 B로 100원을 이체하는 작업이고, 트랜잭션 T2는 A와 B의 계좌에 이자 10%를 입금하는 작업입니다. 트랜잭션 T1에서 A데이터의 락을 도중에 해제했기 때문에, 트랜잭션 T2를 실행할 수 있게 되었고, B의 계좌에 100원이 입금 되기 전에 이자 계산을 하여 일관성이 위배되었습니다.

    2단계 락킹을 사용한 경우

    2단계 락킹 기법을 사용하여, 트랜잭션 T1의 작업이 끝나기 전에 락을 해제하지 않았습니다. 확장 단계에서는 락을 걸기만 하고, 수축 단계에서는 락을 해지하기만 했습니다.

    데드락

    💡
    2개 이상의 트랜잭션이 각각 자신의 데이터에 락을 획득하고 상대방 데이터에 대해 락을 요청하면 무한 대기 상태에 빠질 수 있습니다. 이러한 현상을 데드락 혹은 교착 상태라고 합니다.

    일반적으로 데드락이 발생하면 DBMS는 T1 혹은 T2의 작업 중 하나를 강제로 중지시킵니다. 그 결과 나머지 트랜잭션은 정상적으로 실행됩니다. 이 때 중지시키는 트랜잭션에서 변경한 데이터는 원래 상태로 롤백합니다.

    Reference

    https://mangkyu.tistory.com/30
    https://goodmilktea.tistory.com/62
    MYSQL로 배우는 데이터베이스 개론과 실습, 한빛 아카데미

    '데이터베이스' 카테고리의 다른 글

    인덱싱이란  (0) 2021.08.12
    트랜잭션 - 회복  (0) 2021.08.11
    트랜잭션 - 고립 수준  (0) 2021.08.11
    트랜잭션 - 개념  (0) 2021.08.10

    댓글

Designed by Tistory.