2023.12.11 mysql transaction
어제 잠깐 본 것으로 정리하자면
mysql 5.6 기본 세팅을 기반 스토리지 엔진은 innodb, 격리 수준은 repeatable read.
mysql의 MVCC이 어떻게 동작하냐면
트랜잭션이 시작하면 첫 조회 때 테이블 스냅샷을 뜨고 시작한다.
자신이 시작하기 전에 커밋된 데이터만 읽을 때 사용한다. 트랜잭션 내에서 일관된 select가 가능해진다.
해당 트랜잭션에서 update가 이뤄진다면 버퍼에다가 넣어 놓는다.
이때 다른 트랜잭션이 select한다면 어떻게 될까.
격리 수준마다 다른데 uncommitted read는 이름처럼 커밋하지 않은 내용을 읽는다. 그래서 버퍼에 있는 내용을 읽어버린다.
나머지 격리수준은 스냅샷에서 이전 버전의 값을 읽는다.
내 트랜잭션보다 먼저 커밋된 애들의 정보만 읽는다.
즉 다른 트랜잭션에서 insert나 update를 했더라도, 내 트랜잭션이 시작했을 때 커밋된 내용이 아니면 읽지 않는다.
이전 글에서 말했듯이 MVCC를 이용하더라도 lost update가 발생할 수 있다.
이를 방지하기 위해서 write lock을 잡을 수 있다고 했다.
write lock을 잡을 때 phantom read가 발생할 수 있는데 mysql은 이 또한 막았다.
(phantom read란 한 트랜잭션 안에서 select를 2번 할 때 그 간격 사이에 다른 트랜잭션이 insert 하면 조회 count가 하나 증가하는 것을 말한다.)
locking select는 lock을 잡아야해서 버퍼가 아닌 테이블을 읽는다. 그래서 다른 트랜잭션에서 커밋된 내용이 읽히고 phantom read가 발생한다.
근데 mysql은 next key lock을 잡아버린다. locking select를 하면 다음 next key를 생성하지 못하게 lock을 거는 것이다.
그리고 커밋되어 lock을 반환하면 그 때 생성되는 것이니 phantom read가 발생할 수 없다.
굳이 굳이 발생한다면 첫 조회를 locking select가 아닌 그냥 select를 하면 next key lock이 안 잡힐 것이고 나중에 locking select를 하면 테이블을 조회하니 insert 된 값이 들어있어 phantom read가 된다.
+ 여기서의 snapshot은 undo log를 통해 구현하는 것을 의미하는 것 같다. readview를 나타내고 readview를 통해 undo log를 뒤지는 것 인가?
https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
MySQL :: MySQL 8.0 Reference Manual :: 15.7.2.1 Transaction Isolation Levels
15.7.2.1 Transaction Isolation Levels Transaction isolation is one of the foundations of database processing. Isolation is the I in the acronym ACID; the isolation level is the setting that fine-tunes the balance between performance and reliability, consi
dev.mysql.com
https://engineerinsight.tistory.com/181
[MySQL] MVCC와 언두 로그(Undo log)
💋 MVCC(Multi Version Concurrency Control) 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능 락을 사용하지 않으면서, 일관된 읽기를 제공하기 위한 목적 하나의 레코드에 대해 여러 개의 버전(M
engineerinsight.tistory.com
https://mangkyu.tistory.com/299
[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기
이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해당
mangkyu.tistory.com
https://gisungcu.tistory.com/563
2023.12.10 MVCC
https://mangkyu.tistory.com/288 [MySQL] MVCC(다중 버전 동시성 제어)와 데이터베이스가 트랜잭션을 지원하는 방법과 동작 과정 이번에는 데이터베이스가 트랜잭션을 지원하는 방법과 동작 과정에 대해 살
gisungcu.tistory.com