Skip to content

Latest commit

 

History

History
74 lines (39 loc) · 3.2 KB

어정윤.md

File metadata and controls

74 lines (39 loc) · 3.2 KB

[Database] Lock

1. Lock

락(Lock)이란 데이터의 일관성을 보장하기 위한 방법이다.

  • 일관성: 각 사용자가 일관된 데이터를 볼 수 있다는 것

1.1. Lock 종류

  1. 공유 락(Shared Lock or Read Lock)

    보통 데이터를 읽을 때 사용한다. 원하는 데이터에 락을 걸어도 다른 세션에서 읽을 수 있다.

    공유 락을 설정한 경우 추가로 공유 락을 설정할 수 있지만, 배타 락은 설정할 수 없다. 즉, 내가 보고 있는 데이터는 다른 사용자가 볼 수 있지만 변경할 수는 없다.

    공유 락을 사용하면 조회한 데이터가 트랜잭션이 끝날 때까지 변경되지 않음을 보장한다.

  2. 배타 락(Exclusive Lock or Write Lock)

    보통 데이터를 변경할 때 사용한다. 배타 락을 설정한 경우 공유 락과 배타 락을 모두 획득할 수 없다. 즉, 내가 보거나 변경하고 있는 데이터는 다른 사용자가 볼 수도 변경할 수도 없다.

MySQL 8.0에서의 공유 락, 배타 락

  • 공유 락(SELECT FOR SHARE)

    SELECT * FROM table_name WHERE id = 1 FOR SHARE;
  • 배타 락(SELECT FOR UPDATE)

    SELECT * FROM table_name WHERE id = 1 FOR UPDATE;

1.2. 주의할 점

  1. Blocking

    블로킹(Blocking)은 락들의 경쟁 상태라고도 한다. 블로킹이 발생해 특정 세션이 작업을 진행하지 못하고 멈춘 상태를 의미한다.

    공유 락과 배타 락 또는 배타 락과 공유 락 간 블로킹이 발생할 수 있다.

    → 해결 방법은 Transaction commit 또는 rollback뿐이다.

  2. DeadLock

    데드락(DeadLock)은 트랜잭션 간 교착상태를 의미한다. 두 개의 트랜잭션 간에 각 트랜잭션이 가지고 있는 리소스의 락을 획득하려고 할 때 발생한다.

    스크린샷 2023-07-26 오전 1 31 38

1.3. Lock Level & Escalation

SQL 명령어에 따라 락의 설정 대상이 데이터 row일지 데이터베이스일지 나누어진다.

  • Row Level: 변경하려는 row에만 락을 설정

  • Page Level: 변경하려는 row가 담긴 데이터 페이지(또는 인덱스 페이지)에 락을 설정

    같은 페이지에 속한 row들은 변경작업과 무관하게 모두 락에 의해 잠김

  • Table Level: 테이블과 인덱스에 모두 잠금 설정

    Select table, Alter table, Vacuum, Refresh, Index, Drop, Truncate 등의 작업에서 해당 레벨의 락이 설정됨

  • Database Level: 데이터베이스를 복구하거나 스키마를 변경할 때 발생

References

[DB] Lock이란?

MySQL 8.0의 공유 락(Shared Lock)과 배타 락(Exclusive Lock)