재원이형 글 보고 업데이트할 필요성을 느낌.
Dirty read
- T1이 rollback 되기 전 데이터를 T2가 읽고, T1이 롤백이 되면 T2는 의미없는 값을 갖게 되는 문제가 발생.
- 롤백 된 경우가 매우 중요함.
- read uncommitted
Non-repeatable read
- T1이 데이터를 읽고 T2가 T1이 읽었던 데이터를 업데이트
- 이후 T1이 다시한번 데이터를 읽으면 이전 값과 달라지는 문제가 발생
- 즉, 비일관성(inconsistency)이 발생한다.
- T1이 데이터 한번 읽는다.
- T2가 데이터 변경하고 트랜잭션 커밋 완료(read committed)
- Dirty read와의 차이점.
- valid한 트랜잭션
- T1이 데이터 한번 더 읽었을 때 값 다르게 나오고, 트랜잭션 종료
- DB에서 MVCC(다중 동시성 버전 제어)를 지원해주긴 하지만, 어렵다
- 변경되기 전 버전, 변경된 후 버전에 대한 각각의 값들을 모두 저장하고 있어야 하기 때문.
- Postgres는 모두 이렇게 처리한다.
- postgres에서는 version pointer가 존재하기 때문에 바뀌어도 그대로 읽는다(알아서 이 문제 해결해주는듯)
- Mysql이랑 Orcle, Mysql Server등은 undo라는 table을 따로 둔다고 함.
- 몇버전까지인지는 아직 모름
- Undo table은 이전 값들을 계속해서 디스크에 쓴다.
- mysql은 만약 버전 달라지면, undo log 확인하고 이전 value를 읽는다.
Phantom Read
- 한 트랜잭션 안에서 일정 범위의 레코드를 두번 이상 읽을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상
- T1이 user record를 읽고 T2에서 새로운 데이터를 삽입.
- 이후 T1이 다시 user record를 읽게 되면 보지 못했던 데이터가 삽입된다.
- update가 아니라 새로운 데이터를 삽입(insert)
- 이는 트랜잭션 도중 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타나는 현상을 말한다.
Dirty write
- lost update와 비슷하지만, lost update는 commit 된 데이터에 대해서
- dirty write는 commit되지 않은 데이터에 대해서
- Dirty write is that a transaction updates or deletes (overwrites) the uncommitted data which other transactions insert, update or delete. *Basically, dirty write doesn't occur with all isolation levels in many databases.
Lost updates
