여러 트랜잭션들이 동시 다발적으로 데이타에 접근하여 작업을 할 때 다음의 문제들이 발생할 수 있습니다.

Dirty read: 어떤 트랜잭션 T1이 다른 트랜잭션 T2가 아직 커밋하지 않은 데이타를 읽었는데 T2가 롤백 되는 경우. T1이 읽은 데이타는 dirty.

Nonrepeatable read: 어떤 트랜잭션 T1이 계속 해서 같은 쿼리를 날리는데 그 사이에 다른 트랜잭션 T2가 데이타를 수정하면 T1은 의아해 합니다. 대체 왜 값이 바뀐거지?

Phantom read: 어떤 트랜잭션 T1이 계속 또 쿼리를 날리는데 그 사이 다른 트랜잭션 T2가 새로운 데이타를 추가합니다. T1은 갑자기 나타난 데이타를 보고 귀신을 본 것 처럼 깜짝 놀랍니다.

Lock이라는 것을 레코드 단위로 걸어버리면 저런 문제들이 전혀 발생하지 않겠지만 성능 문제가 심각하게 되겠죠. 따라서 다음과 같은 Isolation level 이 존재합니다.

Isolation level

What it means

ISOLATION_DEFAULT

DB가 사용하는 isolation level을 따릅니다.

ISOLATION_READ_UNCOMMITTED

아직 커밋되지 않은 트랜잭션에 의해 변경된 데이터를 읽을 수
있습니다.

따라서 위에서 지적한 세 개의 문제가 모두 발생할 수 있습니다.

ISOLATION_READ_COMMITTED

●커밋 된 데이터만 읽을 수 있습니다.

Dirty read는 방지할 수
있지만 나머진 발생할 수 있습니다.

ISOLATION_REPEATABLE_READ

●현재 트랜잭션에 의해 데이터를 수정하지 않았다면 항상 같은 데이터를 읽게
합니다.

Dirty readNonrepeatable read는 방지할 수 있지만 Phantom read
방지할 수 없습니다.

ISOLATION_SERIALIZABLE

●모든 문제를 다 방지할 수 있지만 성능이 가장 좋지 않습니다..