티스토리 뷰

_트랜잭션이 보장해야 하는 ACID

  • Atomicity(원자성) : 한 트랜잭션 내에서 실행한 작업들은 하나의 작업으로 간주. 모두 성공 또는 실패되어야 한다.

  • Consistency(일관성) : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지

  • Isolation(격리성) : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리

  • Durability(지속성) : 트랜잭션을 성공적으로 마치면 그 결과가 항상 저장되어야 한다.

 

격리성을 완벽히 보장하기 위해 모든 트랜잭션을 순차적으로 실행한다면 동시성 처리 이슈가 발생한다.
반대로 동시성을 높이기 위해 여러 트랜잭션을 병렬처리하게 되면 데이터의 무결성이 깨질 수 있다.

 

_격리성 관련 문제점

1) Dirty Read

한 트랜잭션(T1)이 데이터에 접근하여 값을 A에서 B로 변경했고, 아직 커밋을 하지 않았을 때

다른 트랜잭션(T2)이 해당 데이터를 Read하면

>> T2가 읽은 값은 B가 될 것. 하지만 T2가 가진 데이터는 꼬이게 된다.

 

2) Non-Repeatable Read

한 트랜잭션(T1)이 데이터를 Read하고 있다. 이때 다른 트랜잭션(T2)가 데이터에 접근하여 값을 변경/삭제 후 커밋을 하면

>> 그 후 T1이 다시 해당 데이터를 Read할 때 변경/삭제된 데이터를 찾게 된다.

 

3) Phantom Read

트랜잭션(T1) 중에 특정 조건으로 데이터를 검색하여 결과를 얻었다.

이 때 다른 트랜잭션(T2)가 접근해 해당 조건의 데이터 일부를 삭제/추가 했을 때, 아직 끝나지 않은 T1이 해당 조건으로 데이터를 조회하면 T2에서 추가/삭제된 데이터가 함께 조회/누락 된다.

그 후 T2가 롤백을하면 데이터가 꼬인다.

 

_트랙잭션 격리 수준

위와 같은 문제들 때문에, ANSI표준에서 트랜잭션의 격리성과 동시 처리 성능 사이의 Trade-off를 두고 4단계 격리수준을 나누었다.

내려갈수록 격리 수준이 높아져서 언급된 이슈는 적게 발생하지만 동시 처리 성능은 떨어진다.

참고로, 트랜잭션이 발생하면 락(Lock)이 걸리는데, SELECT 시에는 공유 락, CREATE/INSERT/DELETE 시에는 배타적 락이 걸린다


1) Read Uncommitted 

한 트랜잭션에서 커밋하지 않은 데이터에 다른 트랜잭션이 접근 가능하다.

즉, 커밋하지 않은 데이터를 읽을 수 있다.

이 수준은 당연히 위에서 언급한 모든 문제에 대해 발생 가능성이 존재한다.
대신,  동시 처리 성능은 가장 높다.

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

 

2) Read Committed 

커밋이 완료된 데이터만 읽을 수 있다.

Dirty Read가 발생할 여지는 없으나, Uncommitted Read 수준보다 동시 처리 성능은 떨어진다.
대신 Non-Repeatable Read 및 Phantom Read는 발생 가능 하다.
데이터베이스들은 보통 Committed Read를 디폴트 수준으로 지정한다.

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

 

3) Repeatable Read

트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다.

이는 개별 데이터 이슈인 Dirty Read, Non-Repeatable Read는 발생하지 않지만,
결과 집합 자체가 달라지는 Phantom Read는 발생가능하다.

발생 문제점 : Phantom Read

 

4) Serializable

가장 엄격한 격리 수준

3가지 문제점을 모두 커버 가능하다. 하지만 동시 처리 성능은 급격히 떨어질 수 있다.

 

참고로 MySQL과 Oracle의 격리 수준은 다르다.

- MySQL : Repeatable Read

- Oracle : Read Committed

 


참고

https://feco.tistory.com/45

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함