실무 들어온 지 얼마 안 된 주니어입니다. 코드 리뷰 때 선임분이 이거 격리수준 낮아서 dirty read 날 수 있다고 하셨는데 솔직히 무슨 말인지 잘 못 알아들었어요. 그냥 넘어가기 뭐해서 여쭤봅니다.
일단 격리수준이 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 이렇게 4단계라는 건 봤는데요. 위로 갈수록 빡세지는 건 알겠는데 각 단계에서 정확히 뭐가 막히고 뭐가 안 막히는지가 헷갈립니다.
그리고 같이 나오는 세 가지 현상이요.
- dirty read
- non-repeatable read
- phantom read
이름만 봐서는 dirty read는 대충 아직 커밋 안 된 값을 읽는 거 같긴 한데, non-repeatable read랑 phantom read 차이를 도저히 모르겠어요. 둘 다 같은 쿼리 두 번 날렸을 때 결과가 달라지는 거 아닌가요? 뭐가 다른 건지 궁금합니다.
예를 들어 이런 상황이요.
-- 트랜잭션 A
SELECT balance FROM account WHERE id = 1; -- 처음 조회
-- (이 사이에 트랜잭션 B가 값 바꾸고 커밋)
SELECT balance FROM account WHERE id = 1; -- 두번째 조회, 값이 다름?
이건 non-repeatable read 맞나요? 그럼 phantom은 WHERE 조건에 걸리는 행 개수가 바뀌는 걸 말하는 건가 싶기도 하고... 각 단계가 이 세 개를 어디까지 막아주는지랑, 실무에서는 보통 어느 수준을 기본으로 쓰는지도 알려주시면 감사하겠습니다. MySQL 기본이랑 다른 DB가 다르다는 얘기도 얼핏 들어서요.