MySQL Phantom Read

REPEATABLE READ

예시

  1. employees에 emp_no=500000, first_name=Lara인 레코드가 존재한다 가정.
  2. 사용자 B가 emp_no=500000인 레코드 조회, 트랜잭션은 아직 종료되지 않은 상태이다.
  3. 사용자 A가 emp_no=500000인 레코드 갱신, MVCC를 통해 InnoDB 버퍼풀 데이터는 변경되지만, 변경 전 데이터가 언두 로그에 저장된다.
  4. 사용자 A COMMIT
  5. 사용자 B가 emp_no=500000인 레코드 다시 조회, 언두 로그의 변경 전 데이터를 반환

https://user-images.githubusercontent.com/50009240/273470232-3b83ff44-4719-44c7-be5b-2f9d4e8770f5.png

REPEATABLE READ Phantom Read

SELECT FOR UPDATE 쿼리는 SELECT 하는 레코드에 쓰기 잠금을 걸어야하는데, 언두 레코드에는 잠금을 걸수없다. 그래서 SELECT FOR UPDATE로 조회되는 레코드는 언두 영역의 변경 전 데이터를 가져오는 것이 아니라 실제 테이블의 레코드의 값을 가져오게 된다.

예시