데이터 중심 애플리케이션 7장(트랜잭션)을 읽다가, 하나의 트랜잭션에서 insert 쿼리후 commit 하지 않고 select로 insert한 결과를 가져올 수 있을까? 하는 궁금증을 가졌다. spring-jpa 에서는 영속성 컨택스트라는 개념이 있기 때문에 가능 할 것 같았지만, DBMS 에서도 가능 할지는 의문이였다.
결론부터 말하면 가져올 수 있다. DB에는 스토리지 엔진이라는 데이터베이스 엔진이 있다. mysql의 innoDB가 스토리지 엔진이다. 이 스토리지 엔진이 트랜잭션을 담당하고 있는데, 버퍼 풀, 로그 버퍼, 리두(redo) 로그, 어댑티브 해쉬 인덱스, 이중 쓰기 버퍼 등의 기능을 제공한다.
Log Buffer
그중 로그 버퍼의 역할은 트랜잭션의 쓰기 내용을 담고 있다가 commit이 되면 DB에 반영 하고 rollback되면 지우게 된다. 따라서 처음 가졌던 의문은 트랜잭션 범위 안에서의 insert 쿼리가 log buffer에 기록되고 select는 로그버퍼에서 정보를 가져오기 때문에 insert된 정보를 가져올 수 있다.
Buffer Pool
버퍼 풀은 데이블과 인덱스를 메모리에 캐하고 있어 디스크 I/O를 줄여준다.
Change Buffer
원하는 테이블이 Buffer Pool에 캐싱 되어 있지 않을 때, 그 데이터를 insert, update, delete하려고 하면 수정된 내용이 Change Buffer에 담기게 되고, 나중에 그 테이블을 Buffer pool에 캐싱하게 될 때 변경사항을 반영하게 된다.
https://dev.mysql.com/doc/refman/8.4/en/innodb-redo-log-buffer.html
https://dev.mysql.com/doc/refman/8.4/en/innodb-buffer-pool.html
https://dev.mysql.com/doc/refman/8.4/en/innodb-redo-log-buffer.html
'computer science > DB' 카테고리의 다른 글
[데이터 중심 애플리케이션 설계] 7장. Write에서의 동시성 문제 (0) | 2024.07.14 |
---|---|
[데이터 중심 애플리케이션 설계] 7장. Isolation Level (0) | 2024.06.30 |
[데이터 중심 애플리케이션 설계] ACID에서 애플케이션과 DB의 책임 분리 (1) | 2024.06.23 |
#1 Redis type (0) | 2024.03.04 |
DBCP(DB connection pool) (0) | 2023.11.04 |