private-books-study / real-my-sql-book-study

real my sql book study 저장소
0 stars 1 forks source link

Study 5 Chapter 트랜잭션과 잠금 #2

Open InJun2 opened 3 months ago

InJun2 commented 3 months ago

진행내용

5월 16일 RealMySQL 5챕터 트랜잭션과 잠금 스터디 진행


하고싶은 이야기 및 문제를 답변으로 작성해주세요

IM-GYURI commented 3 months ago

데이터베이스 복제의 개념과 사용하는 이유

참고한 블로그

복제

복제를 왜 사용할까



InnoDB에서 팬텀 리드를 예방하는 방법

참고한 블로그

InnoDB는 MVCC, Next-Key Lock 과 같은 기술을 사용해 Phantom Read를 방지한다.

MVCC

MVCC는 언두로그에 저장할 때 트랜잭션마다 고유의 ID를 주어 ID기반으로 데이터의 가시성을 판단한다. 따라서 읽기 작업은 트랜잭션의 ID보다 작은 트랜잭션에서 수정된 데이터를 읽게 된다. 이로써 대부분의 Phantom Read 상황을 커버할 수 있다.

그러나 SELECT .. FOR UPDATE같은 쿼리를 실행하면 Phantom Read가 발생한다. 언두 레코드에는 Lock을 걸 수 없기 때문에 현재 레코드의 값을 가져오기 때문이다.

따라서 MVCC는 대부분의 Phantom Read 상황에서 동작하지만, 모든 읽기 작업에서는 완전한 방지를 보장하지는 않는다. 따라서 Next-Key Lock과 같은 기법을 사용하여 Phantom Read를 방지하고 있다.

Nex-Key Lock

SELECT * FROM child WHERE id > 100 FOR UPDATE; 쿼리를 날렸을 때 100 보다 큰 첫 번째 레코드에 대해 락을 걸게 된다. 예를 들어 101이 없고, 다음 ID가 102인 경우 101에 대한 INSERT를 막지 못하게 된다.

이를 방지하기 위해 Next-Key Lock을 사용한다.

InnoDB 스토리지 엔진은 인덱스를 검색하거나 스캔할 때 공유락 또는 배타락을 걸게 된다. 이는 레코드 레벨의 잠금인데, Next-Key Lock 같은 경우는 인덱스 레코드에 대한 락 외에도 인덱스 레코드 이전의 Gap에 대해 락을 걸어 Phantom Read를 방지한다.

예시를 들자면 ID가 100 102인 레코드가 있는 테이블에서 Next-Key Lock없이 트랜잭션이 실행되면 102 이상의 값에 대해서만 락이 걸려 데이터를 생성할 수 없다. 즉 ID가 101인 경우 레코드를 생성할 수 있는데, Next-Key Lock을 사용하게 되면 100~102 사이의 갭과 102 이상의 레코드에 락이 걸리기 때문에 Phantom Read에 대해 자유롭다.

HwangHarim commented 3 months ago

문제1. @Transactional(readOnly = true) 를 적용했을 때 insert, update, delete 를 요청하면 어떻게 될까요?

적용하고 insert, update, delete 작업을 시도하면 예외가 발생

데이터의 일관성을 유지하고, 성능을 향상시키기 위해 조회 연산에만 사용

문제2. @Transactional 메서드 안에 @Transactional이 적용된 메서드가 있으면 어떻게 동작할까요?

Spring의 `@Transactional`의 기본 전략은 `PROPAGATION_REQUIRED`입니다. 이는 현재 트랜잭션이 존재하면 그 트랜잭션에 참여하고, 그렇지 않으면 새로운 트랜잭션을 시작한다는 의미

`@Transactional`이 붙은 메서드 안에서 다른 `@Transactional` 메서드를 호출하면, 두 메서드는 동일한 트랜잭션 컨텍스트에서 실행

`@Transactional`은 애플리케이션 레벨에서 트랜잭션 관리를 제공하는 반면, DB에서의 트랜잭션은 데이터베이스 레벨에서 트랜잭션을 관리

내부 메서드의 트랜잭션 설정은 외부 메서드의 트랜잭션 설정에 영향을 받습니다. 예를 들어, 외부 트랜잭션이 롤백되면, 그 내부에서 실행된 모든 작업도 롤백됩니다.**

문제3. Spring boot에서 @Transactional 을 적용하는 것과 DB에서 Transction을 적용하면 어떤 차이가 있을까요?

서비스 단에서 조정하는 것과 DB 단에서 조작하는 것 이외에는 별로 크게 차이는 없는것 같다.
InJun2 commented 3 months ago

1. DBMS에서의 테이블 락과 자바의 객체 락의 공통점과 차이점

공통점

테이블 락

자바 모니터 락

2. InnoDB 테이블 락에서는 레코드 기반 잠금을 제공하는데 인덱스로 잠그는 이유