락(Lock)이란 데이터의 일관성을 보장하기 위한 방법이다.
- 일관성: 각 사용자가 일관된 데이터를 볼 수 있다는 것
-
공유 락(Shared Lock or Read Lock)
보통 데이터를 읽을 때 사용한다. 원하는 데이터에 락을 걸어도 다른 세션에서 읽을 수 있다.
공유 락을 설정한 경우 추가로 공유 락을 설정할 수 있지만, 배타 락은 설정할 수 없다. 즉, 내가 보고 있는 데이터는 다른 사용자가 볼 수 있지만 변경할 수는 없다.
공유 락을 사용하면 조회한 데이터가 트랜잭션이 끝날 때까지 변경되지 않음을 보장한다.
-
배타 락(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;
-
Blocking
블로킹(Blocking)은 락들의 경쟁 상태라고도 한다. 블로킹이 발생해 특정 세션이 작업을 진행하지 못하고 멈춘 상태를 의미한다.
공유 락과 배타 락 또는 배타 락과 공유 락 간 블로킹이 발생할 수 있다.
→ 해결 방법은 Transaction
commit
또는rollback
뿐이다. -
DeadLock
데드락(DeadLock)은 트랜잭션 간 교착상태를 의미한다. 두 개의 트랜잭션 간에 각 트랜잭션이 가지고 있는 리소스의 락을 획득하려고 할 때 발생한다.
SQL 명령어에 따라 락의 설정 대상이 데이터 row일지 데이터베이스일지 나누어진다.
-
Row Level: 변경하려는 row에만 락을 설정
-
Page Level: 변경하려는 row가 담긴 데이터 페이지(또는 인덱스 페이지)에 락을 설정
같은 페이지에 속한 row들은 변경작업과 무관하게 모두 락에 의해 잠김
-
Table Level: 테이블과 인덱스에 모두 잠금 설정
Select table
,Alter table
,Vacuum
,Refresh
,Index
,Drop
,Truncate
등의 작업에서 해당 레벨의 락이 설정됨 -
Database Level: 데이터베이스를 복구하거나 스키마를 변경할 때 발생