당신은 물었다
READ_UNCOMMITTED 트랜잭션이 다른 트랜잭션에서 커밋되지 않은 데이터를 읽을 수 있도록 커밋되지 않은 데이터는 어디에 저장됩니까?
질문에 대답하려면 InnoDB 아키텍처가 어떻게 보이는지 알아야합니다.
다음 그림은 Percona CTO Vadim Tkachenko에 의해 몇 년 전에 작성되었습니다.
InnoDB 트랜잭션 모델 및 잠금 에 대한 MySQL 문서에 따르면
COMMIT는 현재 트랜잭션에서 작성된 변경 사항이 영구적이며 다른 세션에서 볼 수 있음을 의미합니다. 반면에 ROLLBACK 문은 현재 트랜잭션에 의해 작성된 모든 수정 사항을 취소합니다. COMMIT 및 ROLLBACK은 현재 트랜잭션 중에 설정된 모든 InnoDB 잠금을 해제합니다.
COMMIT 및 ROLLBACK은 데이터 가시성을 제어하므로 READ COMMITTED 및 READ UNCOMMITTED는 변경 사항을 기록하는 구조 및 메커니즘에 의존해야합니다.
- 롤백 세그먼트 / 실행 취소 공간
- 재실행 로그
- 관련된 테이블에 대한 간격 잠금
롤백 세그먼트 및 실행 취소 공간은 변경 사항이 적용되기 전에 변경된 데이터의 모양을 알 수 있습니다. Redo Logs는 데이터가 업데이트 된 것으로 보이기 위해 어떤 변경 사항을 롤 포워드할지 알고 있습니다.
당신은 또한 물었다
READ_COMMITTED 트랜잭션이 커밋되지 않은 데이터를 읽을 수없는 이유, 즉 "더티 읽기"를 수행 할 수없는 이유는 무엇입니까? 이 제한을 시행하는 메커니즘은 무엇입니까?
재실행 로그, 실행 취소 공간 및 잠금 행이 작동합니다. 또한 InnoDB 버퍼 풀 ( innodb_max_dirty_pages_pct , innodb_buffer_pool_pages_dirty 및 innodb_buffer_pool_bytes_dirty로 더티 페이지를 측정 할 수 있음)도 고려해야합니다 .
이것에 비추어, READ COMMITTED는 어떤 데이터가 영구적으로 나타나는지 알 것입니다. 따라서 커밋되지 않은 더티 페이지를 찾을 필요가 없습니다. READ COMMITED는 더티 읽기가 커밋 된 것 이상입니다. READ UNCOMMITTED는 데이터를 표시하기 위해 어떤 행을 잠글 것인지, 어떤 리두 로그를 읽거나 무시했는지를 계속 알고있을 것입니다.
격리 관리를위한 행 잠금을 완전히 이해하려면 InnoDB 트랜잭션 모델 및 잠금을 읽으십시오 .