204. 모순성 (Inconsistency / Unrepeatable Read) - 병행 수행 문제 반복 불가능한 읽기 트랜잭션 격리성 위배 데이터 값 불일치 행위 갱신 에러
핵심 인사이트: (202번 2번 문제 심화) 내 통장(A)에 100만 원, 마누라 통장(B)에 100만 원이 있다. 은행 총액 검사기(T1)가 두 통장의 합이 '200만 원'인지 감사를 시작했다. 1번으로 내 통장(A)을 읽었더니 100만 원이다. 오케이. 이제 마누라 통장(B)을 읽으려는 찰나! 내가 폰뱅킹으로 내 통장(A)에서 50만 원을 마누라 통장(B)으로 0.1초 만에 송금해 버렸다(T2 난입 성공). 감사기(T1)가 이어서 마누라 통장(B)을 읽었더니 150만 원이 들어있다. 엥? "아까 A가 100만 원, 지금 B가 150만 원이니까 합이 250만 원이네?! 은행에 50만 원이 꽁으로 복사 버그가 터졌다!!" 분명히 두 통장의 합은 200만 원이어야 하는데(일관성 유지), 중간에 남이 끼어들어 값을 바꿔치기하는 바람에 앞뒤 말이 안 맞는 헛것을 본 현상, 이것이 모순성(Unrepeatable Read)이다.
Ⅰ. 모순성 (Inconsistency)의 정확한 정의 🌟
- 개념: 하나의 트랜잭션(T1)이 여러 개의 데이터를 읽거나, 같은 데이터를 두 번 반복해서 읽는(Read) 그 중간의 틈새 시간에, 다른 트랜잭션(T2)이 난입하여 그 데이터를 다른 값으로 변경(UPDATE)하고 도망가는 바람에, T1이 앞서 읽은 값과 나중에 읽은 값 사이에 논리적인 앞뒤 모순(불일치)이 터지는 병행 수행 에러입니다.
- 다른 이름: 똑같은 데이터를 두 번 읽었는데 값이 달라졌다고 해서 **반복할 수 없는 읽기(Unrepeatable Read)**라고 부릅니다. (면접에서 두 단어는 100% 같은 말로 쓰입니다.)
Ⅱ. 모순성 (Unrepeatable Read) 작동 시나리오 🌟 핵심 기출 🌟
왜 헛것을 보게 될까요? (에어팟 가격 조회)
- 내가 장바구니 트랜잭션(
T1)을 엽니다. 에어팟 가격을 처음 조회(Read)했더니 **"20만 원"**입니다. - 나는 20만 원인 줄 알고 잠시 결제 비밀번호를 누르고 있습니다.
- 이 찰나의 순간! 애플 관리자(
T2)가 물가 상승을 반영하여 에어팟 가격을 **"25만 원"**으로 올리는 쿼리(UPDATE)를 때리고 무사히 **COMMIT(성공)**하고 퇴근합니다. - 나는 결제 버튼을 누르기 직전, 혹시 몰라 에어팟 가격을 한 번 더 조회(Read)해 봅니다.
- 엥?! **"25만 원"**이라고 뜹니다!
- 대참사 (모순성): 하나의 트랜잭션(
T1)이라는 완벽한 밀실 공간 안에 들어와 있는데, 어떻게 같은 물건을 두 번 읽었는데 값이 20만 원 ➜ 25만 원으로 마술처럼 바뀌어 있습니까? 195번 격리성(Isolation)이 박살 난, 귀신에 홀린 듯한 모순 현상입니다.
Ⅲ. 이 모순을 틀어막는 흑마법 (어떻게 방어하나?) 🌟
내가 방에 들어와 있는 동안 남이 데이터를 못 고치게 만들어야 합니다.
1. Repeatable Read 격리 수준 (공유 락 유지)
- 방어 로직: 내가 에어팟 가격을 처음 읽을 때(Read), 엑셀 칸에다가 195번 자물쇠를 거는데, 수정 금지 자물쇠인 **공유 락(Shared Lock)**을 쾅! 걸어버립니다.
- "내가 이 장바구니 트랜잭션(T1)을 완전히 끄고 나가기(COMMIT) 전까지는, 애플 관리자(T2) 넌 에어팟 가격 절대 못 건드린다(UPDATE 차단)!"
- 애플 관리자는 밖에서 멍때리고 기다려야 합니다. 내 트랜잭션 안에서는 가격을 백 번 천 번 다시 읽어도 영원히 똑같은 '20만 원'이 보장되어 모순성이 완벽히 소멸합니다.
2. 오라클의 마법: 다중 버전(MVCC) 스냅샷
- 근데 자물쇠를 걸면 관리자가 일을 못 해서 시스템이 느려집니다.
- MVCC (다중 버전 동시성 제어): 자물쇠를 안 겁니다! 관리자(T2)가 25만 원으로 고치게 냅둡니다!
- 대신 나(T1)한테는, 내가 처음 트랜잭션을 시작했던 과거 시점에 찍어둔 '과거 스냅샷 앨범(20만 원)'만 무조건 계속 보여줍니다. 진짜 DB 값은 25만 원으로 바뀌었지만, 나는 내 밀실 안에서 평생 과거의 환상(20만 원)만 일관성 있게 계속 보게 되어 모순성(Unrepeatable Read)을 안 겪고 안전하게 쇼핑을 마칠 수 있습니다.
Ⅳ. 갱신 손실(203번)과의 차이점 (헷갈림 주의)
- 갱신 손실: 남이 고친 결과를 내가 '덮어써서 지워버리는(Write)' 사고.
- 모순성(Unrepeatable Read): 남이 고치고 간 결과를 내가 '두 번 읽었더니(Read)' 앞뒤가 달라서 멘붕이 오는 사고. (나는 아무것도 안 고쳤음!)
📢 섹션 요약 비유: **모순성(Unrepeatable Read)**은 미술관에서 **'1분 만에 색깔이 바뀌는 마술 그림'**을 보는 것과 같습니다. 내가 안경(트랜잭션 T1)을 끼고 모나리자 그림(데이터)을 처음 봤을 때는 옷이 '빨간색'이었습니다. 안경을 한 번 끼면 벗을 때까지 빨간색이 유지되어야 정상(격리성)입니다. 그런데 내가 잠시 고개를 돌린 사이, 큐레이터(트랜잭션 T2)가 몰래 들어와 모나리자 옷을 '파란색'으로 덧칠하고 도망갔습니다(UPDATE & COMMIT). 내가 다시 고개를 돌려 모나리자를 봤더니 옷이 '파란색'으로 변해있습니다! "뭐야 ㅆㅂ 내 안경이 미쳤나? 같은 방 안에서 1분 만에 어떻게 색깔이 바뀌어?!" 앞뒤 문맥(일관성)이 완전히 틀어져 버린 모순의 지옥입니다. 이 정신병을 막으려면, 내가 안경을 끼고 있는 동안 큐레이터가 아예 방에 못 들어오게 문을 잠가버리거나(Lock), 아니면 큐레이터가 파란색으로 색칠을 하든 말든 내 안경(MVCC 스냅샷)에는 과거의 빨간색 옷만 홀로그램처럼 계속 띄워줘서 평화로운 환상을 지켜주는 철통 방어 기술이 필요합니다.