Database - 9. 트랜잭션 격리 수준 편

Perdy·2023년 9월 18일
0

CS

목록 보기
18/20

트랜잭션 격리수준

트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준을 의미합니다

필요성

데이터베이스는 트랜잭션이 독립적인 수행을 하도록 하는데, 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 필요합니다.
하지만 수행되고 있는 많은 트랜잭션을 순서대로 처리하는 방식으로만 구현하게 되면 DB의 성능이 떨어지게 될 것이고, 반대로 성능을 높이기 위해 처리 방식의 범위를 줄이게 되면, 잘못된 값이 처리될 가능성이 생기게 됩니다.

따라서, 최대한 효율적인 방식으로 진행하는 것이 중요합니다.

Read Uncommitted ( 레벨 0 )

한 트랜잭션에서 처리중이거나 커밋하지 않은 데이터에 다른 트랜잭션이 접근하는 것을 허용하는 것을 말합니다. 다양한 문제가 발생할 수 있지만, 동시 처리 성능은 가장 높습니다.
발생 문제점 : Dirty Read, Non-Repeatable Read, Phantom Read

Read committed ( 레벨 1 )

커밋이 이루어진 트랜잭션만 조회가 가능하며, 다른 트랜잭션이 수행되는 동안 다른 트랜잭션은 접근 할 수 없어서 대기하게 됩니다. 대부분의 SQL 서버가 Default로 사용하는 isolation level이기도 합니다.

  • Dirty Read가 발생할 가능성은 없지만, Read Uncommitted보다 동시 처리 성능이 떨어집니다.

발생 문제점 : Non-Repeatable Read, Phantom Read

Repeatable Read ( 레벨 2 )

트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회가 가능합니다.
트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장합니다. 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대해 수정이 불가능하며, MySql에서 Default로 사용되는 레벨이기도 합니다.
발생 문제점 : Phantom Read

Serializble ( 레벨 3 )

트랜잭션이 완료될 때까지 select 문장이 사용되는 모든 데이터에 공유 잠금이 걸립니다.
완벽한 읽기 일관성 모드를 제공하며, 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능합니다. 그렇지만 동시 처리 성능이 떨어질 수 있습니다.

발생 가능한 문제점들

Dirty Read
커밋되지 않은 수정중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상으로, 어떤 트랜낵션에서 아직 실행이 끝나지 않은 다른 트랜잭션에 의해 변경사항을 보게되는 경우를 말합니다.

Non-Repeatable Read
한 트랜잭션에서 같은 쿼리를 두 번 수행할 때, 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서, 두 쿼리의 결과가 상이하게 나타나는 현상으로, 일관성이 깨졌다고 할 수 있습니다.

Phantom Read
한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상으로, 트랜잭션 도중 새로운 레코드 삽입을 허용하리 때문에 나타나는 현상입니다.

profile
영원한 뉴비. 꾸준히 한다면 언젠가는 높은 곳에 도달할지도?

0개의 댓글