Search

DB 격리 수준

DB의 격리 수준은 여러개의 트랜잭션이 어떠한 행위를 했을때 정합성이 깨지지 않음을 보장하는 척도이다. 정합성 보장의 순서대로 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 등의 격리 수준이 존재한다.
READ COMMIT
DB 수정 트랜잭션과 접근 트랜잭션 두개가 동시에 작동하고 있을때, 수정 트랜잭션이 DB 테이블을 UPDATE 한 후, 커밋되기 전까지는 다른 트랜잭션은 수정되기 전 데이터로밖에 접근할수가 없다.
DB는 자체적으로 READ UNCOMMIT행위의 정합성 문제(Dirty read)를 방지하기 위해 UPDATE나 INSERT문 등 테이블에 수정활동이 이루어지는 동안 undo라는 영역을 만들어 커밋이 이루어지기 전까지 이전 데이터를 저장해둔다. 커밋 전까지 접근 트랜잭션은 이 undo 영역의 데이터에 접근하여 읽어온다.
커밋을 한 후에는 undo 영역의 데이터가 수정된 값으로 업데이트 되는데, 접근 트랜잭션 또한 undo 영역에서 커밋된 결과를 확인할 수 있다. 이를 READ COMMIT행위라 부른다.
READ COMMIT의 정합성 문제
수정 트랜잭션의 UPDATE 후 커밋 전까지는 DB 데이터가 수정되더라도 접근 트랜잭션은 undo영역밖에 볼 수 없기 때문에 수정 전 데이터로밖에 접근할 수가 없다. 하지만 수정 트랜잭션의 커밋 이후에 접근 트랜잭션이 다시 한번 접근하게 되면 바뀐 데이터에 접근하게 된다. 이는 하나의 트랜잭션내에서 똑같은 SELECT 쿼리를 실행했을 때는 항상 같은 결과를 가져와야 하는 REPEATABLE READ의 정합성에 어긋난다.
MySQL
MySQL은 InnoDB의 스토리지 엔진을 사용하며 REPEATABLE READ의 격리수준을 보장한다. 이 격리수준 이상으로는 부정합이 발생하지 않는다. 대신 트랜젝션의 실행에서 “다른 데이터” 대신 “없는 데이터”가 발생하기도 하는데, 이를 phantom read 현상이라 부른다.