스터디내 다른 팀원들이 요새 동시성 제어에 대하여 하도 이야기를 해서 궁금해서 찾아보다가 여기까지 왔다.
우선 두 트랜잭션이 동시에 일어나는 상황의 경우와, 그에 따른 문제와, 해결 방법을 나열해보면 다음과 같다.
읽기-읽기 : 문제 없음 -> 아무것도 안함
읽기-쓰기 : 문제 발생 가능 -> 트랜잭션 고립 수준 선택
쓰기-쓰기 : 문제 발생 -> 락킹
이 중 읽기-쓰기 상황에 일어날 수 있는 문제들과, 각 문제를 해결하기 위한 트랜잭션 고립 수준들에 대해 정리하려고 한다. (전공책에 최대한 잘 정리해놨는데도 다시 보니 이해하기 어려워서 다시 정리한다.)
(READ UNCOMMITTED (Level 0))
DIRTY READ : 커밋이 안됐는데 읽을 수 있는 문제
설명 : 한 트랜잭션이 쓰고 커밋 안한 데이터를 다른 트랜잭션이 읽어버림, 그리고 원래 트랜잭션이 롤백 시키고 다른 트랜잭션이 다시 읽었을 때 값이 달라짐
-> 트랜잭션 고립수준 READ COMMITTED (Level 1) 적용 : 커밋한 데이터만 읽을 수 있음
NON-REPEATABLE READ : 트랜잭션 간 읽기 락킹이 안 됐는데 읽을 수 있는 문제
설명 : 한 트랜잭션이 두 번 읽는데(한번 읽고 나중에 또 읽음), 그 사이에 다른 트랜잭션이 그 값을 업데이트시키고 나가버리면, 처음 읽었을 때와 후에 읽었을 때 다른 값이 나옴
-> 트랜잭션 고립수준 REPEATABLE READ (Level 2) 적용 : 트랜잭션의 작업 간 읽기 락 적용 (한 트랜잭션이 읽은 리소스를, 다른 트랜잭션이 수정 못하게 락킹)
PHANTOM READ : 트랜잭션과 트랜잭션이 동시에 실행가능한 문제
설명 : 한 트랜잭션이 조회했을때 없었는데, 다른 트랜잭션이 어떤 값을 써넣고 나가버리면, 원래 트랜잭션이 다시 조회했을때 없던 값이 생겨버림
-> 트랜잭션 고립수준 SERIALIZABLE (Level 3)적용 : 한 트랜잭션이 실행되는 동안 다른 트랜잭션은 아예 실행안됨
* 예시 상황은 전공책(오라클로 배우는 데이터베이스 개론과 실습) 450p에 있는 챕터를 참고하자.
* DBMS마다 구현방식이 다름, 일반적으로 ANSI/ISO standard에서의 정의를 참고(오라클 성능고도화 원리와 해법1 106p 참고)
+ 번외
낙관적인 락 vs 비관적인 락
[10분 테코톡] 우주의 낙관적인 락, 비관적인 락 <- 보면 바로 이해됨
사실 이거 때문에 시작했는데, 진짜 별 내용 아니었음..