https://www.maeil-mail.kr/question/92
요약: 동시성 제어에는 크게 잠금 기반의 제어와 MVCC의 스냅샷을 이용한 제어가 존재한다. 일반적으로 자주 사용하는 mysql은 이 두방식을 혼용해서 사용한다.
잠금 기반의 제어는 크게 공유락,베타락을 이용한 제어가 존재하며, 공유락은 읽기 트랜잭션을 사용할 때 다른 배타락을 걸려고 하는 쓰기 트랜잭션을 막고, 베타락은 다른 트랜잭션을 다 막아준다.
잠금을 통한 동시성 제어는 트랜잭션을 제어시에 상호 배제를 이용해서 완벽하게 제어할 수 있지만,
만약 상당히 많은 요청이 들어올 경우, 커낵션 풀이 부족해져서 데드락이 걸릴 수도 있고, 성능상 락을 걸고 있는 트랜잭션때문에 기다리고 있는 트랜잭션의 성능이 안좋아 질 수 밖에 없다.
출처:https://www.borntodare.me/ac27e0ac-6b99-40b2-a207-45ac22d0b4f7
락 기반의 제어를 위해서 성능상의 문제를 해결하기 위해서, 스냅샷을 도입해서, 하나의 읽기 트랜잭션에서 별도의 하나의 스냅샷을 사용할 수 있는 MVCC이 존재한다.
MVCC를 이용하면 read-read 작업, read-write작업시의 read 작업때 락을 걸지 않고, 각 트랜잭션이 다른 스냅샷을 이용하므로, 성능상의 이점을 가진다.
이를 통해서 읽기 작업을 할 때는 다른 쓰기 트랜잭션의 영향을 받지 않고 수행이 가능하다.
select * from videos!
update videos SET category="!!!"
기존에는 위의 두 트랜잭션을 수행하면 동시성 문제가 발생할 수 있으나, MVCC는 서로 다른 스냅샷을 사용하므로써 문제가 발생하지 않는다.
하지만 아래와 같이 한 트랜잭션 내에 읽기, 쓰기가 모두 있다면 문제가 생긴다.
또한 mvcc를 이용하면 스냅샷을 이용하므로, 공간상으로는 그리 좋지 않다.
따라서 이 경우에는 exclusive lock을 걸어서 해결하는 것이 나을 것 같고, 이 때문에 mysql은 읽기 작업을 할 때는 MVCC를 쓰기 작업을 할 때는 lock-based control을 사용한다.
출처: https://www.youtube.com/watch?v=wiVvVanI3p4