← 질문 목록
#330깊이 0
읽기만 하는데도 잠금이 걸리는 경우가 있는가?
있다. 어떤 격리 수준을 골랐느냐에 따라 읽기도 남을 기다리게 만든다.
- SERIALIZABLE읽은 범위까지 잠근다. 남이 그 사이에 못 끼운다
- REPEATABLE READ같은 것을 다시 읽어도 같은 값이 나온다
- READ COMMITTED커밋된 것만 읽는다. 읽을 때마다 달라질 수 있다
- READ UNCOMMITTED아직 커밋 안 된 것도 읽는다
위로 갈수록 남을 더 많이 막는다. 대신 이상한 현상이 줄어든다.
요즘 DB는 대부분 잠그지 않고 푼다. 값을 고칠 때 옛 버전을 남겨 두고, 읽는 쪽은 자기 시점의 버전을 본다. 그래서 읽기가 쓰기를 안 막는다.
그래도 SERIALIZABLE에서는 다르다. 겹치면 잠그거나, 커밋할 때 검사해 어긋난 쪽을 되돌린다. 어느 쪽인지는 DB마다 다르다.
먼저 DB의 기본 격리 수준을 확인해야 한다. 표준이 정한 기본은 SERIALIZABLE인데 그대로 쓰는 DB는 드물다. MySQL InnoDB는 REPEATABLE READ, PostgreSQL은 READ COMMITTED다.