read commited와 repeatable read 차이점

lsy·2022년 10월 23일
0

헷갈리는 차이점

두 격리 수준에 대해 헷갈렸는데 정리해보고자 한다.

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

한 트랜잭션이 위 쿼리문을 실행한다고 하자. SELECT * FROM T; 를 실행하고 1분 후 다시 SELECT * FROM T; 를 실행하는 쿼리다.


read commited에서는 커밋된 어떤 데이터든 볼 수 있다.

첫 번째 SELECT * FROM T; 이후에 기다리던 1분 동안 동시에 실행되던 다른 트랜잭션들이 해당 테이블의 데이터를 추가, 수정, 삭제하고 커밋한다면 해당 내용이 반영된다. 따라서 두 번째 SELECT * FROM T;를 실행했을 때 첫 번째와 결과가 달라질 수 있다.

따라서 Non-repeatable reads, Phantom read 현상이 발생할 수 있다.

repeatable read에서는 두 번째 쿼리의 데이터가 첫 번째 데이터의 쿼리의 데이터들로부터 변경 또는 삭제되지 않음을 보장한다. (데이터가 추가될 수 있음)

첫 번째 SELECT * FROM T; 이후에 기다리던 1분 동안 동시에 실행되던 다른 트랜잭션들이 해당 테이블의 데이터를 수정, 삭제하여도 위 쿼리문을 실행하던 트랜잭션이 보고 있는 데이터(테이블 T의 데이터들)들은 변경되거나 삭제되지 않는다. 따라서 변경, 삭제되지 않음을 보장한다. 하지만 만약 데이터를 추가한다면 그 내용을 보게될 수도 있다.

따라서 Non-repeatable reads는 발생하지 않고, Phantom read 현상이 발생할 수 있다.


Non-repeatable reads : 한 트랜잭션내에서 테이블 A에 대한 같은 쿼리를 실행할 때 테이블 A의 데이터가 수정 또는 삭제를 당해 같은 결과 값을 보장하지 못하는 것.

Phantom read : 한 트랜잭션내에서 테이블 A에 대한 같은 쿼리를 실행할 때 테이블 A에 새로운 데이터가 추가되어 이전에 존재하지 않던 row가 보이게 되는 것.


reference

https://stackoverflow.com/questions/4034976/difference-between-read-commited-and-repeatable-read

profile
server를 공부하고 있습니다.

0개의 댓글