트랜잭션 격리 수준

데일리·2024년 11월 26일
0

TIL

목록 보기
13/16

DB에서 데이터에 대한 작업을 하다보면 마주치는 트랜잭션 해당 트랜잭션에 대해서는 격리 수준에 대한 설정을 할 수 있는데 이번에는 이 격리 수준에 대해서 알아보자

1. 트랜잭션 격리 수준이란?

트랜잭션 격리 수준은 동시에 여러 트랜잭션이 실행 될 때 한 트랜잭션이 다른 트랜잭션에 영향을 받지 않도록 하는 정도를 말한다. 낮은 격리 수준은 동시 처리 능력을 높이지만, 데이터 일관성의 문제를 발생시킬 수 있고 반면 높은 격리 수준은 데이터 일관성을 보장하지만 동시 처리능력이 떨어질 수 있다.

즉 데이터 정합성과 동시 처리 능력은 반비례 한다.

2. 격리 수준

  • Read UnCommited: 커밋이 되지 않는 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 조회할 수 있도록 허용, 또한 해당 격리 수준에는 Dirty Read, Phatom Read, Non-Repeatable Read 문제가 발생할 수 있다.

  • Read Commited: 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회할 수 있도록 허용한다. 특정 트랜잭션이 이루어지는 동안 해당 데이터에 다른 트랜잭션은 접근 할 수 없다. Dirty Read는 발생할 수 없지만, Phatom Read, Non-Repeatable Read는 발생할 수 있다.

  • Repeatable Read: 한 트랜잭션에서 특정 레코드를 조회할 때 항상 같은 데이터를 응답하는 것을 보장한다 하지만 Serializable과 같은 다르게 행이 추가되는 것을 마지는 않는다. Non-Repeatable Read문제가 발생하지는 않지만 Phantom Read 문제가 발생할 수 있다.

  • Serializable: 특정 트랜잭션이 사용중인 테이블의 모든 행을 다른 트랜잭션이 사용할 수 없게 잠근다. 가장 높은 데이터 정합성을 가지지만 성능이 가장 낮다. MySQL의 경우 단순한 쿼리가 실행되더라도 데이터베이스 잠금이 걸려 다른 트랜잭션에서 데이터에 접근할 수 없다.

발생하는 문제

  • Dirty Read: 한 트랜잭션이 다른 트랜잭션이 변경 중인 데이터를 읽을 때 발생, 다른 트랜잭션이 아직 커밋되지 않은(즉 롤백할 가능성이 있는) 데이터를 읽어서, 그 데이터가 나중에 롤백이 될 경우 트랜잭션의 결과가 변경될 수 있다. 이는 데이터 일관성을 무너뜨린다.

  • Phatom Read: 한 트랜잭션이 동일한 쿼리를 두번 실행 했을 때 두 번의 쿼리 사이에 다른 트랜잭션이 삽입, 갱신, 삭제 등의 작업을 수행하여 결과 집합이 달라지는 경우, 이로 인해 한 트랜잭션이 일관성 없는 결과를 가져올 수 있다.

  • Non Repeatable Read: 같은 트랜잭션 안에서 동일한 쿼리를 실행했을 때 다른 결과를 얻는 경우, 예를 들어 한 트랜잭션이 같은 데이터를 두번 읽을 때 첫 번째 읽기와 두 번째 읽기 사이에 다른 트랜잭션이 해당 데이터를 변경할 경우 발생

마무리 하면서

실무에서는 Read Committed와 Repeatable Read를 주로 사용한는데 사용하는 서비스의 특징(엄격성, 데이터 정합성의 중요도, 성능)을 생각하여 해당 격리 수준을 설정한다.

profile
하루에 한편 씩 읽기 좋은 테크 로그

0개의 댓글