Isolation levels
여러 트랜잭션들이 동시 다발적으로 데이타에 접근하여 작업을 할 때 다음의 문제들이 발생할 수 있습니다.
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 read와 Nonrepeatable read는 방지할 수 있지만 Phantom read는 |
ISOLATION_SERIALIZABLE |
●모든 문제를 다 방지할 수 있지만 성능이 가장 좋지 않습니다.. |