데이터베이스 락
DB의 트랜잭션 처리의 순차성을 보장하기 위해 데이터 변경을 일시적으로 중지하는 것.
일반적으로 일관성과 무결성을 유지하기 위해 DB에서 사용하는 공통적인 방법이다.
락은 데이터베이스 뿐만 아니라 어플리케이션에서도 걸 수 있는데, 어플리케이션단에서 거는 락은 대체로 Optimistic DB에서 거는 것은 대체로 Pessemistic락이다.
낙관적 (충돌시 락) : 실제 데이터베이스에 락을 걸지 않기 때문에 데드락 적음, 충돌이 빈번하지 않으면 성능이 좋다. (보통 버저닝을 가장 많이 사용한다.)
충돌을 인지하는 시점이 커밋 시점이므로, 충돌이 발생해서 롤백해야 한다고 했을 때, 그 전에 수행했던 모든 동작이 롤백되어야 하므로 충돌시 오버헤드가 크다.
Versioning
@Version
을 사용하면 사용가능)비관적 (충돌 예상시 락) : 실제 데이터베이스에 락을 건다.
대체로 DB에서 설정
충돌이 발생하는 시점을 바로 인지 하므로, 충돌이 발생했을 때, 낙관적 락보다 오버헤드가 덜하다 / 데이터 무결성을 지키기 용이하다.
락을 건다는 것 자체가 데이터 베이스 리소스를 사용하는 것이므로 충돌이 없으면 오버헤드 발생
Pessemistic 락에 대한 설명(InnoDB)
공통적으로
X락(exclusive)
S락(shared)
외에도 update lock, intent lock이 있다.
InnoDB는 어떤 락 방식을 사용할까?
레코드락
gap lock
데드락이 생기는 경우
→ deadlock detection (작은 트랜잭션을 롤백 시킴)
→ lock wait timeout (일정시간 지나면 감지)
etc
락에대해 고민할 때 고려사항
충돌이 빈번한지
읽기 / 쓰기 연산의 비율
-> 일반적인 웹 어플리케이션은 읽기가 대부분이므로 웹 어플리케이션은 낙관적 lock을 사용한다.
그럼 DB에서 처리하는 락은 어떤 것들이 있을까?
perssimistic lock은 데이터베이스, 엔진마다 상이하기 때문에 사용하는 제품 또는 버전에 따라 공부하고 사용해야한다.