TIL

5.3 InnoDB 스토리지 엔진 잠금

5.3.1 InnoDB 스토리지 엔진의 잠금

레코드 락

갭 락

넥스트 키 락

자동 증가 락

자동 증가 락 작동 방식

MySQL 5.1부터는 innodb_autoinc_lock_mode 변수를 이용해 자동 증가 락의 작동 방식을 변경할 수 있다.

하지만 MySQL 8.0부터는 바이너리 로그 포맷의 기본값이 ROW 포맷이 되었고 innodb_autoinc_lock_mode의 기본값은 2가 되었다.

5.3.2 인덱스와 잠금

다시 언급하지만 InnoDB의 잠금은 레코드 자체가 아닌 인덱스에 잠금을 건다. 즉 변경할 레코드를 찾기 위해 검색한 인덱스 모두 락을 걸게 된다.

인덱스 잠금 예제

UPDATE employees SET hire_date=NOW() 
WHERE first_name='Georgi' AND last_name='Klassen';

테이블에 인덱스가 하나도 없다면 테이블 풀 스캔을 하면서 레코드를 찾기 때문에 모든 레코드를 잠그게 된다. 이런 현상이 발생하기 때문에 InnoDB에선 인덱스 설계가 매우 중요하다.

5.3.3 레코드 수준의 잠금 확인 및 해제

SHOW PROCESSLIST;
id Time State Info
17 607   NULL
18 22 updating UPDATE employees … WHERE emp_no=10001
19 21 updating NULL
SELECT
	r.trx_id waiting_trx_id,
	r. trx_mysql_thread_id waiting_thread, r.trx_query walting_query,
	b.trx_id blocking_trx_id,
	b.trx_mysql_thread_id blocking_thread,
	b.trx_query blocking_query
FROM performance_schema.data_lock waits w
INNER JOIN information_schema.innodb_trx b
	ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
	ON r.trx_id = w.requesting_engine_transaction_id;
waiting_trx_id waiting_thread waiting_query blocking_trx_id blocking_thread blocking_query
11990 19 UPDATE.. 11989 18 UPDATE..
11990 19 UPDATE.. 11984 17 NULL
11989 18 UPDATE.. 11984 17 NULL