본문 바로가기

Development/TIL

트랜잭션의 동시성과 격리수준

동시성(Concurrency)이란?

다수의 클라이언트가 하나의 데이터를 동시에 사용 및 공유하는 것이다.

이때 여러 작업이 동시에 수행되면 동시성 문제(Concurrency Issues)가 발생할 수 있다.

 

동시성 문제란, 여러개의 트랜잭션이 동시에 실행될 때 각각의 트랜잭션이 데이터를 일관성 있게 처리하지 못하는 문제를 말한다. 예를 들어 A와 B 두 개의 트랜잭션이 동시에 실행될 때 A 트랜잭션에서 수정한 데이터가 B 트랜잭션에서 읽어들인 데이터와 일치하지 않는 경우가 발생할 수 있다.

 

동시성 문제를 해결하기 위해 하나의 클라이언트가 자원(Resource)를 점유할 수 있도록하는 자원 잠금(Resource Locking)을 사용한다. 이것을 락(Lock)기반 제어 기술이라고 한다.

 

 

락(Lock)이란?

락은 동시성을 제어하기 위해 사용하는 기능이다. 데이터를 점유하여 다른 트랜잭션의 접근을 막고 동시성과 일관성의 균형을 맞춘다. 그리고 데이터의 무결성을 확보할 수 있다.

 

락(Lock)의 종류

  1. 공유 락(Shared Lock)
    다수의 트랜잭션이 동시에 같은 데이터를 읽을 수 있도록 허용한다.
    공유 락은 읽기(READ) 작업에서만 사용되며, 해당 락을 사용하는 트랜잭션이 모든 작업을 수행하면 락이 해제된다.

  2. 배타적 락(Exclusive Lock)
    다른 트랜잭션이 데이터에 접근하는 것을 막는다.
    쓰기(WRITE) 작업에서만 사용된다.

락킹 수준(Locking Level)

락킹 수준은 데이터에 적용되는 락의 정도를 말한다.

  1. 글로벌 락(Global Locks)
    DB의 모든 테이블에 락을 걸어 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없도록 만든다. 가장 높은 수준의 락이며, 가장 큰 범위를 가지고 있다.

  2. 테이블 락(Table Locks)
    테이블 단위로 락을 거는 방식이다. 하나의 트랜잭션이 작업중일 때, 다른 트랜잭션이 테이블에 접근하지 못하게 한다.

  3. 네임드 락(Named Locks)
    테이블이나 테이블의 행과 같은 DB 오브젝트가 아닌, 특정한 문자열을 점유한다.

  4. 메타데이터 락(Metadata Locks)
    다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 DB의 객체를 동시에 수정하지 못하도록 한다.

위처럼 락과 락킹 수준은 여러 종류가 있는데 잘못 설정할 경우 교착 상태(Dead Lock)가 발생할 수 있다.
교착 상태(Dead Lock)란 여러 테이블에 락을 적용하여 다수의 트랜잭션이 서로 작업을 끝내지 못하고 무한 대기 상태가 되는 것이다. 이런 상황이 발생하지 않게 하려면 락을 명확히 이해하고 적재적소에 사용해야 한다.

 

 

 

트랜잭션의 격리 수준(Isolation Level)

여러 트랜잭션이 동시에 처리될 때 다른 트랜잭션에서 변경 및 조회하는 데이터를 읽을 수 있도록 허용하거나

거부하는 것을 결정하기 위해 사용.

 

READ UNCOMMITTED

  • 커밋되지 않은 읽기를 허용하는 격리 수준
  • 가장 낮은 격리 수준이며 동시성은 높지만 일관성이 쉽게 깨질 수 있다.

READ COMMITTED

  • 커밋된 읽기만을 허용하고 SELECT 문을 실행할 때 공유 락을 건다.
  • 다른 트랜잭션이 데이터를 수정하고 있는 중에는 데이터를 읽을 수 없다.

REPEATABLE READ

  • 읽기를 마치더라도 공유락을 풀지 않으며 트랜잭션이 완전히 종료될 때까지 락을 유지한다.
  • 공유락이 걸린 상태에서 데이터를 수정하는 것은 불가능하지만, 데이터를 삽입 또는 삭제는 가능하다.
    이로인해 팬텀 읽기가 발생할 수 있다.

SERIALIZABLE

  • 데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 읽거나 삽입 또는 추가가 불가능하다.
  • 가장 높은 수준의 격리이다. 동시성이 떨어지는 문제점이 존재한다.

 

 

커밋되지 않은 읽기(Uncommitted Read)란?

다른 트랜잭션에 의해 작업중인 데이터를 읽게 되는 것이다.

커밋 되지 않은 읽기가 발생할 경우, 의도치 않은 데이터를 참조하게 되어 데이터의 일관성이 깨지는 상황이 발생한다.

 

 

 

팬텀 읽기(Phantom Read)란?

하나의 트랜잭션이 실행 중, 동시에 실행된 다른 트랜잭션에 의해 삭제된 데이터를 팬텀행(Phantom Rows)라고 하는데

이 팬텀행에 해당하는 데이터를 읽는 것을 팬텀 읽기라고 한다.

 

 

 

격리수준(Isolation Level)과 락(Lock)의 차이

  1. 적용 대상
    격리수준은 트랜잭션 자체에 적용되는 것이고 락은 데이터에 적용된다.

  2. 동작 방식
    격리수준은 트랜잭션 간에 일관성을 유지하면서 동시성을 제공하는 데 중점을 둔다.
    격리수준이 높을수록 데이터의 일관성은 유지되지만 동시성은 떨어질 수 있다.
    락은 동시에 여러 트랜잭션에서 접근하는 데이터를 보호하기 위해 사용된다.
    락은 다른 트랜잭션에서 데이터를 수정하는 것을 막음으로써 데이터의 일관성을 유지하면서 동시성을 제공한다.

격리수준과 락 모두 DB의 동시성과 일관성을 유지하기 위해 사용된다.

다만 격리수준은 트랜잭션 간의 격리를 제어하고 락은 여러 트랜잭션에서 공유하는 데이터에 작용한다.

'Development > TIL' 카테고리의 다른 글

git으로 commit하고 push하자  (0) 2023.05.06
객체지향 프로그래밍(Object Oriented Programming)  (0) 2023.05.03
Transaction과 ACID  (1) 2023.04.29
Thunder Client  (0) 2023.04.28
MongoDB와 MySQL  (0) 2023.04.27