transaction isolation level 개념 정리 #2

백엔드·2023년 8월 30일

Transaction Isolation

목록 보기
2/2

들어가며

이전 글에서 이어집니다.
이전 글에서는 이상현상에 대해 주로 살펴보았습니다.
이번 글에서는 Snpashot Isolation과 Isolation level에 대해 살펴보겠습니다.

Isolation level

배경

앞서 살펴본 이상한 현상들이 모두 발생하지 않게 만들 수 있지만 그러면 제약사항이 많아져서 동시 처리 가능한 트랜잭션 수가 줄어들어 결국 DB의 전체 처리량이 하락하게 됩니다.

그러던 중, 일부 이상한 현상을 허락하는 몇 가지 level을 만들어서 사용자가 필요에 따라 적절하게 선택할 수 있도록 하는 Isolation level이 생겨났습니다.

개념

트랜잭션 격리 수준은 동시에 실행되는 여러 트랜잭션 간에 얼마나 서로 영향을 주고받을지를 결정합니다. 이상한 현상(Dirty Read, Nonrepeatable Read, Phantom Read)을 허용하거나 방지하는 수준을 설정하여, 데이터의 일관성과 격리 수준 사이에서 trade-off를 조정할 수 있습니다.

Snpashot Isolation

개념

스냅샷 격리는 데이터베이스 트랜잭션에서 사용되는 격리 수준 중 하나로, 트랜잭션의 시작 시점에서 해당 트랜잭션의 동작을 위해 필요한 데이터들을 스냅샷이라는 임시 영역에 복사하여 사용하는 방식을 의미합니다. 이 때 스냅샷은 해당 트랜잭션의 격리 수준 내에서 데이터를 읽는 기준이 되며, 해당 트랜잭션이 다른 트랜잭션과 격리되어 독립적으로 실행되도록 합니다.

예시

  1. 트랜잭션 A가 x의 값을 읽습니다.

  2. 트랜잭션 A는 x의 현재 값을 스냅샷으로 복사합니다.

  3. 트랜잭션 A가 x의 값애 40을 뺍니다. 트랜잭션 A가 관리하는 스냅샷에서 x의 값에 40을 뺀 값을 계산합니다.

  4. 트랜잭션 B가 y에 100을 입금하는 작업을 시작합니다.

  5. 트랜잭션 B는 y의 현재 값을 스냅샷으로 복사하고, 해당 스냅샷에서 y의 값에 100을 더한 값을 계산합니다.

  6. 트랜잭션 B가 커밋되면, 해당 스냅샷에서 계산한 y의 값인 150이 데이터베이스에 반영됩니다.

  7. 트랜잭션 A는 다시 y의 현재 값을 스냅샷으로 복사하고, 해당 스냅샷에서 y의 값에 40을 더한 값을 계산합니다. 트랜잭션 A가 y를 읽을 때는 트랜잭션 A가 시작된 시점에서의 값을 기준으로 읽습니다. 그렇기 때문에 트랜잭션 A가 시작된 시점에서의 값인 50을 읽습니다.

  8. 트랜잭션 A가 커밋을 시도하면, 트랜잭션 B가 먼저 커밋되었기 때문에 트랜잭션 A는 충돌이 발생하게 되어 rollback됩니다. 이로 인해 트랜잭션 A에서 계산한 스냅샷 내용은 폐기됩니다.

스냅샷 격리에서는 두 개의 트랜잭션이 동시에 같은 데이터를 변경하려고 할 때, 먼저 커밋된 트랜잭션만을 인정하고 나중에 커밋된 트랜잭션은 rollback되는 특징이 있습니다. 이렇게 함으로써 먼저 커밋된 트랜잭션이 다른 트랜잭션의 변경 사항을 덮어쓰는 문제를 방지하며, 데이터의 일관성과 격리성을 보장합니다.

실무에서 Isolation level





profile
백엔드 개발자

0개의 댓글