동시에 작용하는 다중 트랜잭션 상호간섭 작용에서 Database 를 보호하는 것

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