MySQL ‐ MySQL LockType - thought-corner/Backend-PlayGround GitHub Wiki

MySQL - MySQL LockType

락을 거는 범위(Scope)

  • 락을 얼마나 넓게 걸 것인가에 대한 분류입니다. 범위가 넓을수록 안전하지만 동시 처리 성능은 크게 떨어진다.
  • 테이블 락(Table Lock) : 특정 테이블 전체에 락을 건다. DDL(ALTER TABLE 등)을 실행할 때 주로 발생하며, 테이블 락이 걸리면 다른 트랜잭션은 그 테이블에 데이터를 읽거나 쓸 수 없다.
  • 레코드 락(Row-level Lock) : 테이블 전체가 아니라 내가 조작하려는 그 행(Row)에만 딱 락을 건다.

락의 목적 - Shared vs Exclusive

공유 락(Shared Lock, S-Lock)

  • 데이터를 안전하게 읽기 위해 건다.
  • 여러 트랜잭션이 동시에 같은 데이터에 S-Lock을 걸 수 있다. 그러나 S-Lock이 걸린 상태에서 X-Lock은 불가능하다.
-- MySQL 8.0 방식 (이전 버전은 LOCK IN SHARE MODE)
SELECT * FROM stock_trade_history WHERE stock_code = '005930' FOR SHARE;

배타 락(Exclusive Lock, X-Lock)

  • 데이터를 수정하거나 삭제하기 위해 건다.
  • X-Lock은 이름 그대로 배타적이다. 이미 해당 데이터에 S-Lock이나 X-Lock이 걸려있다면, 그것이 풀릴 때까지 무조건 대기해야 한다. 반대로 X-Lock이 이미 걸려 있다면 다른 곳에서 내 데이터에 접근할 수 없다.
-- 데이터를 조회하지만, 곧 수정할 것이므로 남들은 건드리지 못하게 X-Lock을 검
SELECT * FROM stock_trade_history WHERE stock_code = '005930' FOR UPDATE;