읽기 작업에도 트랜잭션이 필요할까?

Alex·2025년 3월 8일
0

CS를 공부하자

목록 보기
68/74

트랜잭션 경계를 설정하지 않고, 자동 커밋을 실행하면
모든 sql마다 트랜잭션이 별도로 시작된다.

문장마다 하나의 연결을 열고 닫는 결과를 초래한다(성능상 악영향)

트랜잭션을 선언한다는 것은 1) 트랜잭션 전체를 하나의 연결로 수행하는 것이고
2) 트랜잭션 간의 격리를 활용할 수 있다는 것이다.

특히 읽기를 할 때 읽기락이 있어야, 조회 이후로 데이터가 변경되는 것을 막을 수 있다.

다만, MySQL에서 InnoDB는 읽기락을 쓰는 대신 MVCC로 여러 버전의 데이터를 관리하는 방식이다.

이런 경우라도 트랜잭션이 필요할까?

MVCC를 좀더 공부해보자.

InnoDB는 다중 버전 동시성 제어(MVCC)를 통해 특정 시점의 데이터베이스 스냅샷을 제공한다.

이를 통해

  • 쿼리는 그 시점 이전에 커밋된 트랜잭션의 변경사항만 볼 수 있다.
  • 동일한 트랜잭션 내에서 이전 명령어로 변경된 내용은 볼 수 있다.

REPEATABLE READ (기본 격리 수준)에서는 모든 읽기가 해당 트랜잭션의 첫번째 읽기에서 설정된 스냅샷을 사용한다. 더 최신 스냅샷을 얻으려면 현재 트랜잭션을 커밋하고 새 쿼리를 실행해야 한다.

이런 방식을 활요하기 때문에 Select를 할 때 read 락을 걸지 않는다.
MVCC도 결국 트랜잭션 내부에서 실행되는 것으로 보인다.

트랜잭션이 시작되면서 InnoDB가 해당 트랜잭션의 타임포인트를 정하고, 이 타임포인트를 기준으로 트랜잭션이 어떤 버전의 테이블을 볼 것일지를 정한다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글