Open KKambi opened 1 year ago
READ UNCOMMITTED
일 때 발생한다.
READ COMMITTED
, REPEATABLE READ
, SERIALIZABLE
에서는 커밋된 로그 or 언두 로그를 읽어 발생하지 않는다.UPDATE
에 의해 발생한다.INSERT
, DELETE
에 의해서 발생한다.READ COMMITTED
vs REPEATABLE READ
이전 트랜잭션의 ID 값이 더 작으니까, Repeatable Read가 보장 안되지 않을까?
Read Committed
Repetable Read
A. 칼럼 c1의 값이 각각 13 / 17 인 레코드 2개
SELECT c1 FROM t WHERE c1 BETWEEN 10 AND 20 FOR UPDATE
수행 시 아래 범위에 갭 락
따라서 해당 트랜잭션 내에서 이미 조회한 범위에 대해서는 INSERT를 할 수 없으므로 Phantom Read도 발생하지 않는다.
12/04 (5.1 ~ 5.3)
바이너리 로그 포멧의 종류
--binlog-format=type
ROW
: row 기반의 로깅 (default)STATEMENT
: statement 기반 로깅MIXED
바이너리 로그 포멧을 설정한다고 해서, 바이너리 로깅이 활성화되는 것은 아니다.
그럼 왜 여러 타입이 필요할까?
innodb_autoin_lock_mode
InnoDB는 AUTO_INCREMENT 값의 채번을 위해 테이블당 하나만 사용되는
AUTO_INCREMENT 락
을 제공한다.그럼 Upsert 쿼리 문장을 사용하면 어떻게 될까? (팀원 경험)
INSERT INTO table (columns...) VALUES (values...) ON DUPLICATE KEY UPDATE column = value
Replace 쿼리 문장
왜 2개의 행이 영향을 받을까?
궁금증1
배치 프로그램의 많은 레코드 변경 쿼리는 자주 데드락의 원인이 되곤 한다.
-> 변경해야할 레코드를 찾기 위해 검색한 인덱스의 레코드를 모두 락을 걸기 때문이런 경우 동일 데이터를 변경하거나 참조하는 프로그램끼리 분류해서 네임드 락을 걸고 쿼리를 실행하면 아주 간단히 해결
-> Q. 원리가 뭐지? -> 동일 데이터 변경, 참조 = 같은 인덱스에 대해 락을 걸게 된다 -> 데드락 = 서로 동일한 데이터를 필요로 하게 되며 발생 -> 네임드 락으로 해소!궁금증2
InnoDB의 잠금은 레코드를 잠그는 것이 아니라 인덱스를 잠그는 방식
-> Q. 아니 그래서 왜 이렇게 설계한거지? -> 인덱스와 레코드 사이의 정합성 때문일까?