트랜잭션 격리 수준은 동시에 여러 트랜잭션이 실행 될 때 한 트랜잭션이 다른 트랜잭션에 영향을 받지 않도록 하는 정도를 말한다. 낮은 격리 수준은 동시 처리 능력을 높이지만, 데이터 일관성의 문제를 발생시킬 수 있고 반면 높은 격리 수준은 데이터 일관성을 보장하지만 동시 처리능력이 떨어질 수 있다.
즉 데이터 정합성과 동시 처리 능력은 반비례 한다.
Read UnCommited: 커밋이 되지 않는 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 조회할 수 있도록 허용, 또한 해당 격리 수준에는 Dirty Read, Phatom Read, Non-Repeatable Read 문제가 발생할 수 있다.
Read Commited: 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회할 수 있도록 허용한다. 특정 트랜잭션이 이루어지는 동안 해당 데이터에 다른 트랜잭션은 접근 할 수 없다. Dirty Read는 발생할 수 없지만, Phatom Read, Non-Repeatable Read는 발생할 수 있다.
Repeatable Read: 한 트랜잭션에서 특정 레코드를 조회할 때 항상 같은 데이터를 응답하는 것을 보장한다 하지만 Serializable과 같은 다르게 행이 추가되는 것을 마지는 않는다. Non-Repeatable Read문제가 발생하지는 않지만 Phantom Read 문제가 발생할 수 있다.
Serializable: 특정 트랜잭션이 사용중인 테이블의 모든 행을 다른 트랜잭션이 사용할 수 없게 잠근다. 가장 높은 데이터 정합성을 가지지만 성능이 가장 낮다. MySQL의 경우 단순한 쿼리가 실행되더라도 데이터베이스 잠금이 걸려 다른 트랜잭션에서 데이터에 접근할 수 없다.
Dirty Read: 한 트랜잭션이 다른 트랜잭션이 변경 중인 데이터를 읽을 때 발생, 다른 트랜잭션이 아직 커밋되지 않은(즉 롤백할 가능성이 있는) 데이터를 읽어서, 그 데이터가 나중에 롤백이 될 경우 트랜잭션의 결과가 변경될 수 있다. 이는 데이터 일관성을 무너뜨린다.
Phatom Read: 한 트랜잭션이 동일한 쿼리를 두번 실행 했을 때 두 번의 쿼리 사이에 다른 트랜잭션이 삽입, 갱신, 삭제 등의 작업을 수행하여 결과 집합이 달라지는 경우, 이로 인해 한 트랜잭션이 일관성 없는 결과를 가져올 수 있다.
Non Repeatable Read: 같은 트랜잭션 안에서 동일한 쿼리를 실행했을 때 다른 결과를 얻는 경우, 예를 들어 한 트랜잭션이 같은 데이터를 두번 읽을 때 첫 번째 읽기와 두 번째 읽기 사이에 다른 트랜잭션이 해당 데이터를 변경할 경우 발생
실무에서는 Read Committed와 Repeatable Read를 주로 사용한는데 사용하는 서비스의 특징(엄격성, 데이터 정합성의 중요도, 성능)을 생각하여 해당 격리 수준을 설정한다.