트랜잭션

트랜잭션

동시성 문제

  • Dirty Read

    • 트랜잭션이 아직 커밋되지 않은 데이터를 읽을 때 발생하는 문제

    • 트랜잭션 A가 트랜잭션 B에서 수정중이지만 커밋되지 않은 데이터를 읽을 수 있다. 트랜잭션 B에서 롤백 등의 이유로 커밋되지 않으면, 트랜잭션 A는 존재하지 않는 데이터를 사용하게 된다.

  • Non Repeatable Read

    • 트랜잭션이 동일한 행을 두 번 읽었지만 매번 다른 데이터를 가져오는 문제

    • 트랜잭션 1이 행을 읽는다고 가정하고, 트랜잭션 2는 해당 행을 업데이트하거나 삭제하고 업데이트 또는 삭제를 커밋한다. 트랜잭션 1이 행을 다시 읽으면 다른 행 값이 검색되거나 행이 삭제되는 경우가 발생한다.

  • Phantom Read

    • 트랜잭션이 조건을 사용해 특정 범위의 레코드를 두번 읽었지만 매번 다른 데이터를 가져오는 문제

    • 팬텀: 검색 기준과 일치하지만 처음에는 보이지 않는 행

    • 트랜잭션 1이 일부 검색 기준을 만족하는 일련의 행을 읽는다고 가정한다. 트랜잭션 2는 트랜잭션 1의 검색 기준과 일치하는 새 행(업데이트 또는 삽입을 통해)을 생성한다. 트랜잭션 1이 행을 읽는 문을 다시 실행하면 다른 행 집합을 가져온다.

Transaction Isolation LevelDirty readsNonrepeatable readsPhantoms

Read uncommitted

O

O

O

Read committed

X

O

O

Repeatable read

X

X

O

Serializable

X

X

X

Isolation Level

READ UNCOMMITTED

  • 가장 낮은 고립 수준

  • 트랜잭션 내의 질의들이 공유 락을 걸지 않고 데이터를 읽음

  • 따라서 오손 데이터를 읽을 수 있음

  • 갱신하려는 데이터에 대해서는 독점 락을 걸고, 트랜잭션이 끝날 때까지 보유함

SET TRANSACTION READ WRITE
ISOLATION LEVEL READ UNCOMMITTED;

READ COMMITTED

  • 트랜잭션 내의 질의들이 읽으려는 데이터에 대해서 공유 락을 걸고, 읽기가 끝나자 마자 락 해제

  • 따라서 동일한 데이터를 다시 읽기 위해 공유 락을 다시 걸고 데이터를 읽으면, 이전에 읽은 값과 다른 값을 읽는 경우가 생길 수 있음

  • 갱신하려는 데이터에 대해서는 락을 걸고, 트랜잭션이 끝날 때까지 보유

  • PL/SQL의 디폴트 고립 수준

REPEATABLE READ

  • 질의에서 검색되는 데이터에 대해 공유 락을 걸고, 트랜잭션이 끝날 때까지 보유함

  • 한 트랜잭션 내에서 동일한 질의를 두 번 이상 수행할 때, 이전에 읽은 값이 항상 동일하게 유지됨

  • 갱신하려는 데이터에 대해서는 독점 락을 걸고, 트랜잭션이 끝날 때까지 보유함

SERIALIZABLE

  • 가장 높은 고립 수준

  • 질의에서 검색되는 튜플들 뿐만 아니라 인덱스에 대해서도 공유 락을 걸고 트랜잭션이 끝날 때까지 보유함

  • 범위 질의의 경우 다시 조회할 때 추가되거나 제거된 레코드로 인해 팬텀 문제 발생 -> 인덱스에 대한 락으로 해결 가능, 범위를 포함한 상위 개념까지 락을 걸면 비용이 많이 들기 때문에 인덱스 락이 좋음, Next key value locking으로 해결

  • 한 트랜잭션 내에서 동일한 질의를 두 번 이상 수행할 때 매번 같은 값을 포함한 결과를 검색하게 됨

  • 갱신하려는 데이터에 대해서는 독점 락을 걸고 트랜잭션이 끝날 때 까지 보유함

Last updated