트랜잭션 격리 수준(Isolation Level)은 데이터베이스에서 동시성 제어를 위해 사용되는 개념입니다. 여러 개의 트랜잭션이 동시에 실행될 때, 격리 수준은 각 트랜잭션에서 어떤 다른 트랜잭션의 결과를 볼 수 있는지를 결정합니다.
4가지 트랜잭션 격리 수준
- READ UNCOMMITTED: 커밋되지 않은 데이터도 읽을 수 있고, 다른 트랜잭션에서 변경 중인 데이터도 읽을 수 있습니다. 이 격리 수준에서는 Dirty Read 문제가 발생할 수 있습니다.
- READ COMMITTED: 커밋된 데이터만 읽을 수 있습니다. 다른 트랜잭션에서 변경 중인 데이터는 읽을 수 없습니다. 이 격리 수준에서는 Non-Repeatable Read 문제가 발생할 수 있습니다.
- REPEATABLE READ: 트랜잭션 동안 같은 쿼리를 실행하면 항상 같은 결과를 보장합니다. 다른 트랜잭션에서 새로운 데이터를 추가하는 것은 가능하지만, 수정하거나 삭제하는 것은 불가능합니다. 이 격리 수준에서는 Phantom Read 문제가 발생할 수 있습니다.
- SERIALIZABLE: 가장 엄격한 격리 수준으로, 모든 트랜잭션을 순차적으로 실행합니다. 다른 트랜잭션에서 변경 중인 데이터를 읽을 수 없고, 새로운 데이터를 추가하거나 수정하는 것도 불가능합니다. 이 격리 수준에서는 모든 문제를 방지할 수 있지만, 동시성이 낮아질 수 있습니다.
트랜잭션 격리 수준은 동시성과 데이터 일관성을 균형있게 조절하기 위해 선택되어야 합니다. 격리 수준이 높을수록 데이터 일관성은 보장되지만, 동시성이 낮아질 수 있습니다.
MySQL과 MariaDB의 기본 트랜잭션 격리 수준
MySQL과 MariaDB의 기본 트랜잭션 격리 수준은 REPEATABLE READ입니다. 이는 MySQL과 MariaDB의 모든 스토리지 엔진에서 기본으로 사용되는 격리 수준입니다.
다음과 같이 MySQL에서 SERIALIZABLE 격리 수준을 설정할 수 있습니다.
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Dirty Read, Non-Repeatable Read, Phantom Read 에 대한 설명과 예시
Dirty Read : 트랜잭션 A가 데이터를 수정하고, 아직 커밋하지 않은 상태에서 다른 트랜잭션 B가 해당 데이터를 읽어들이는 상황을 말합니다. 이 때, B가 읽은 데이터는 A가 수정한 내용이 반영된 결과가 됩니다. 하지만 A가 롤백을 수행하거나 커밋하지 않아 데이터가 변경되지 않을 경우, B가 읽은 데이터는 올바르지 않은 결과가 됩니다.
예를 들어, A가 "Alice"의 나이를 20세에서 30세로 수정하고, 커밋하지 않은 상태에서 B가 "Alice"의 나이를 조회하는 상황입니다. B는 "Alice"의 나이를 30세로 읽을 수 있으나, A가 롤백을 수행하면 B가 읽은 데이터는 올바르지 않습니다.
Non-Repeatable Read : 트랜잭션 A가 데이터를 읽어들인 후, 다른 트랜잭션 B가 해당 데이터를 수정하거나 삭제한 경우, A가 같은 데이터를 다시 읽어들이면 B의 변경 사항이 반영된 결과를 얻는 문제입니다.
예를 들어, A가 "Alice"의 나이를 20세로 조회하고, 이후 B가 "Alice"의 나이를 30세로 수정한 상황입니다. 이후 A가 다시 "Alice"의 나이를 조회하면, B의 변경 사항이 반영된 30세가 결과로 나타납니다.
Phantom Read : 트랜잭션 A가 WHERE 조건에 따라 일부 행을 읽어들인 후, 다른 트랜잭션 B가 해당 조건에 맞는 행을 삽입하거나 삭제하는 경우, A가 같은 조건으로 다시 조회할 때, B의 삽입/삭제된 행이 나타나는 문제입니다.
예를 들어, A가 나이가 20세인 모든 사람을 조회하고, 이후 B가 나이가 20세인 새로운 사람을 추가한 상황입니다. 이후 A가 다시 나이가 20세인 모든 사람을 조회하면, B가 추가한 새로운 사람이 결과로 나타납니다.
'기타' 카테고리의 다른 글
OMTM(One Metric That Matters) (0) | 2023.02.22 |
---|---|
Semantic Versioning (0) | 2023.02.22 |
수평적 확장과 수직적 확장 (0) | 2023.02.22 |
NoSQL과 RDBMS 비교 (0) | 2023.02.22 |
[용어] failover (0) | 2023.02.22 |