데이터베이스 이상 현상 종류

비구름·2025년 6월 22일

데이터베이스

목록 보기
6/8

이상 현상이란

데이터베이스에 여러 접근이 시도되면서 잘못된 쓰기와 잘못된 읽기가 발생하는 경우를 이상현상이라고 합니다.

트랜잭션이 고립된 정도에 따라 수행중에 발생할 수 있습니다.

데이터베이스 개발자들은 트랜잭션의 격리 수준을 만들기 위해 이상 현상을 정리하고 이것을 해결하기 위한 격리 수준을 만들어냈습니다.

읽기 이상 현상

SQL 표준에서 여러 트랜잭션이 동시 수행될 때 발생할 수 있는 읽기 현상을 더티 읽기, 반복 불가능 읽기, 팬텀 읽기로 분류한다.

더티 읽기

아직 커밋되지 않은 다른 트랜잭션의 데이터를 읽는 것을 말한다.

예시

  • 데이터 : 1
  • 트랜잭션 A : 데이터를 2로 변경하는 트랜잭션
  • 트랜잭션 B : 데이터를 읽어오는 트랜잭션

트랜잭션 A가 데이터를 2로 변경시키고 커밋되기 전에 트랜잭션 B가 데이터를 읽어온다면 설정에 따라 다르지만 변경된 데이터인 2를 가져오게 됩니다. 이때 A가 커밋이 되지 못하고 롤백이 된다면 데이터는 1에서 변경되지 않은 상태이지만 트랜잭션 B는 2라는 데이터를 가져와 올바르지 않은 값을 가져오게 됩니다.

반복 불가능 읽기

트랜잭션이 동일한 로우를 두 번 쿼리했을 때 둘의 결과가 다른 것을 말한다.

하나의 트랜잭션에서 추가적인 수정없이 같은 쿼리를 보낼 경우 같은 값을 가져와야하지만 서로 다른 값을 가져오기 때문에 문제가 생기게 됩니다.

예시

  • 데이터 : 1
  • 트랜잭션 A : 데이터를 2로 변경하는 트랜잭션
  • 트랜잭션 B : 데이터를 2번 읽어오는 트랜잭션

트랜잭션 B에서 데이터를 1로 읽어온 후 트랜잭션 A에서 2로 변경하고 그리고 트랜잭션 B에서 다시 데이터를 읽어왔을 경우 데이터를 2로 가져오게 됩니다.

팬텀 읽기

여러 로우를 두 번 쿼리했을 때 결과가 다른 현상을 말한다.

트랜잭션에서 범위 쿼리를 수행할 경우 팬텀 레코드를 포함할 수 있다.

반복 불가능 읽기와 유사하지만 팬텀 읽기는 여러 로우 즉 범위 탐색이라는 점에서 차이가 존재한다.

예시

  • 데이터 : 1, 2, 3
  • 트랜잭션 A : 데이터 3을 하나 더 추가시키는 트랜잭션
  • 트랜잭션 B : 처음에 전체 데이터 개수를 가져오고 각 데이터의 개수를 가져오는 트랜잭션

트랜잭션 B가 처음 데이터 개수인 3을 가져오고 트랜잭션 A가 실행된 후 각 데이터 개수를 가져온다면 전체 데이터는 3개이지만 각 데이터의 개수는 1, 1, 2로 합이 4가 되어 오류가 생긴다.

쓰기 이상 현상

쓰기 이상 현상은 갱신 분실과 더티 쓰기, 쓰기 치우침으로 분류할 수 있다.

갱신 분실

서로 다른 트랜잭션이 같은 데이터를 읽고 수정하는 과정에서 서로의 존재를 모르기에 서로의 결과를 덮어씌워 하나를 제외한 나머지의 갱신 값이 사라지게 된다.

예시

  • 데이터 : 1
  • 트랜잭션 A : 데이터를 2로 수정하는 트랜잭션
  • 트랜잭션 B : 데이터를 3으로 수정하는 트랜잭션

트랜잭션 A가 실행되며 데이터를 2로 수정하지만 트랜잭션 B가 데이터를 3으로 수정해버리기에 트랜잭션 A가 수행한 결과는 덮어씌워지게 된다.

더티 쓰기

커밋되지 않은 값을 읽고 수정 및 커밋되어 커밋되지 않은 값에 따라 결과가 달라지는 현상을 말한다.

예시

  • 데이터 : 1
  • 트랜잭션 A : 데이터를 1 더해주는 트랜잭션
  • 트랜잭션 B : 데이터를 1 더해주는 트랜잭션

정상적인 동작이라면 트랜잭션 A, 트랜잭션 B가 수행되면 데이터는 3이 되어야하지만 각 트랜잭션은 데이터 1을 읽고 각각 1을 더한 2로 수정하기 때문에 데이터는 2로 저장되게 된다.

쓰기 치우침

개별 트랜잭션은 불변 조건을 충족하지만 동시 수행 시 조건이 위반되는 현상을 말한다.

예시

  • 데이터 : 1
  • 조건 : 데이터는 음수가 되어서는 안된다. (0 ≤ 데이터)
  • 트랜잭션 A : 데이터에서 1을 빼더라도 조건이 충족함을 확인하고 1을 빼주는 트랜잭션
  • 트랜잭션 B : 데이터에서 1을 빼더라도 조건이 충족함을 확인하고 1을 빼주는 트랜잭션

각 트랜잭션은 데이터인 1을 읽고 조건이 충족하여 1을 빼는 것으로 수행하게 된다. 여기서 더티 쓰기가 일어나지 않아 데이터는 -1이 되고 불변 조건인 “데이터는 음수가 되어서는 안된다.”에 위배가 된다.

profile
기본부터 정리해나가는 기록용 블로그

0개의 댓글