LOCK - based concurrency control
- 같은 데이터에 대해서 서로 다른 트랜잭션이 read, read 하는 경우에는 허용하지만, 그 외의 경우에는 허용하지 않아서 한 쪽이 실행되면 다른 한 쪽은 blcok이 돼서 기다려야 하기 때문에 동시에 처리할 수 있는 처리량이 줄어들어서 퍼포먼스에 안 좋은 영향이 있음.
LOCK - based concurrency control 의 문제를 해결하기 위해서 MVCC가 등장하게 됨.
MVCC (multiversion concurrency control)
- 같은 데이터에 대해서 서로 다른 트랜잭션이 write, write 하는 경우에는 한 쪽이 block 되지만, 그 외의 경우에는 block이 되지 않고 동시에 처리가 가능하기 때문에 동시에 처리할 수 있는 데이터의 처리량이 증가함.
MVCC
- 데이터를 읽을 때 특정 시점 기준으로 가장 최근에 commit된 데이터를 읽음
- 데이터 변화(write) 이력을 관리함
- read와 write는 서로를 block 하지 않음
특정 시점 기준은 isolation level에 따라 다름.
read committed - read하는 시간을 기준으로 그 전에 commit 된 데이터를 읽음.
repeatable read - tx 시작 시간 기준으로 그 전에 commit 된 데이터를 읽음.
MySQL 에서는 이렇게 특정 시점 기준으로 commit된 데이터를 읽는 방식을 Consistent read 라고 함.
serializable level 에서는 repeatable read level과 동일한 결과가 나옴.
MySQL에서는 serializable level 이 MVCC로 동작하기 보다는 lock으로 동작함.
postgreSQL 에서는 SSI(Serializable Snapshot Isolation) 기법이 적용된 MVCC로 동작함.
read uncommitted level 에서는 보통 MVCC가 적용되지 않음. MVCC는 committed된 데이터를 읽기 때문.
postgreSQL의 repeatable read level
- 같은 데이터에 먼저 update한 tx가 commit 되면 나중 tx는 rollback 됨
이런 특징을 first-updater-win 이라고 부르기도 함.
postgreSQL에서 lost update 문제를 해결하기 위해서는, repeatable read 만으로 해결할 수 있음.
또한, 한 tx의 isolation level만 repeatable read 로 바꿔주는 것이 아니라 연관된 다른 tx의 isolation level도 repeatable read 로 챙겨줘야 함.
MySQL 에서 lost update 문제를 해결하기 위해서는, 값을 read할 때 추가적으로 lock를 줄 수 있도록 해야함.
즉, read 하면서도 write lock을 취득할 수 있도록 개발자가 쿼리를 짜주면 됨. 이것을 Locking read 라고 부름.
locking read는 isolation level이 repeatable read 일지라도, read할 때 tx이 시작된 시점에 commit된 데이터가 아니라, 가장 최근에 commit된 데이터를 read함.
locking read 를 사용할 때, FOR UPDATE; 를 사용하면 write lock, 즉 exclusive lock 을 획득하겠다는 의미이고,
FOR SHARE; 는 read lock, 즉 shared lock 을 획득하겠다는 의미임.
repeatable read level 에서 write skew 문제를 해결해주려면, MySQL에서는 locking read 를 사용하면 됨.
postgreSQL 에서도 for update, for share 키워드를 사용해서 문제를 해결할 수 있지만, 작동 방식이 조금 다름.
postgreSQL에서 repeatable read level 은 같은 데이터에 먼저 update한 tx가 commit 되면 나중 tx는 rollback 되기 때문에, 나중 tx이 rollback 한 이후에 다시 tx이 작동하면서 문제 해결.
아니면, MySQL이나 postgreSQL 모두 serializable level 을 사용해서 write skew 를 해결할 수 있음.
MySQL 에서의 serializable level
- repeatable read와 유사함
- tx의 모든 평범한 select 문은 암묵적으로 select ... for share 처럼 동작함.
postgreSQL 에서의 serializable level
- SSI (serializable snapshot isolation) 로 구현
- first-committer-winner 방식으로 동작함
출처 : https://www.youtube.com/watch?v=-kJ3fxqFmqA&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=20
'DB' 카테고리의 다른 글
21. DB 정규화 (normalization) (0) | 2023.05.09 |
---|---|
20. Functional dependency (0) | 2023.05.09 |
18. concurrency control - Lock (0) | 2023.05.04 |
17. transaction isolation level (0) | 2023.05.04 |
16. concurrency control - 2 (0) | 2023.05.03 |
댓글