DB는 한 데이터가 동시적으로 여러 요청이 들어올때 데이터의 손상을 막기위해 Lock을 지원한다. Mysql InnoDB에서는 어떤 방식으로 Lock을 지원하는지 알아보자.
테이블 레코드에 락이 걸린다.
index를 기준으로 하여 index 없이 수정을 하려하면 테이블 모든 레코드에 락이 걸린다.
Person 테이블이 다음과 같다고 하자.
| id | 이름 | 나이 |
|---|---|---|
| 1 | 김철수 | 20 |
| 3 | 김철시 | 21 |
select * from Person where id=1 for update
Record Lock을 통해 id가 1인 레코드가 X-Lock에 걸리게 된다.
select * from Person where 나이>=20 for update
나이가 index로 되어있다고 가정했을때
Record Lock을 통해 나이가 20 이상인 레코드가 X-Lock에 걸리게 된다.
select * from Person where 이름="김철수" for update
이름이 index가 아니라고 했을때
Record Lock을 통해 모든 레코드가 X-Lock에 걸리게 된다.
아직 생성 이전에 조건에 맞는 인덱스가 락에 걸린다.
주로 혼자 사용되지않고 Next Key Lock시 같이 사용됨.
Person 테이블이 다음과 같다고 하자.
| id | 이름 | 나이 |
|---|---|---|
| 1 | 김철수 | 20 |
| 3 | 김철시 | 21 |
select * from Person where id<=3 for update
id<=3에 해당되는 존재하지 않는(id=2)에 대해 Gap Lock이 걸려 id=2인 레코드를 생성할 수 없게된다
Record Lock + Gap Lock
범위 인덱스를 조건으로 걸때 사용된다.