동시에 작용하는 다중 트랜잭션 상호간섭 작용에서 Database 를 보호
하는 것Read 하는 시간을 기준
으로 그 전 commit 된 데이터 읽음트랜잭션 시작 시간 기준
으로 그 전에 commit 된 데이터 읽음특정 시점 기준
으로 가장 최근 commit 된 데이터
읽음 → MySQL Consist Read
변화(write) 이력
관리read 와 write는 서로를 block 하지 않음
→ MVCC해당 고립 레벨에서는 MVCC 적용 X
Lost Update
문제PostgreSQL
MVCC의 lost update
문제first-updater-win
트랜잭션마다 다른 isolation level
을 줄 수 있기 때문에 발생하는 문제postgreSQL
MVCC는 lost update
를 repeatable read 만으로 해결
가능Repeatable Read
MySQL
MVCC의 lost update
문제Locking Read
필요 → consist read읽기를 하면서 쓰기 락을 걸어주는 기능
결과적으로 쓰기 락이 걸려있으므로, 다른 트랜잭션에서 Locking Read 가 걸려있는 상황에서는 락을 얻을 수 없음
MySQL
에서 Locking Read 는 isolation level과는 상관없이 가장 최근 commit 된 데이터
읽음
종류
- for update
- 쓰기 락 = 배타 락
- for share
- 읽기 락 = 공유 락
select balance from account where id = 'x' for update;
Write Skew
문제Isolation Level
을 Serializable
로 변경하면 해결select for update
/ select for share
로 락을 걸어 해결 가능하지만, MySQL과 PostgreSQL 동작 방식이 다름Locking Read
Repeatable Read
원칙 적용Locking Read (for update)
걸기모든 평범한 select 문은 암묵적으로 select for share
처럼 동작MVCC 보다는 락 방식
을 사용한다고 말함MySQL이랑 동작이 다름
PostgreSQL
MVCC
는 Repeatable Read Isolation Level
에서 적용받는 규칙 적용됨먼저 update 한 트랜잭션이 commit 되면 나중 트랜잭션은 rollback
여전히 MVCC로 동작
하면서 동시성 문제 해결