Database and Lock

권태용·2021년 3월 29일
0

Database

목록 보기
3/3

DB 구성

  • ServerEngine - Client의 Query를 받고 해당 Query에 대한 결과 값을 보내주는 부분 (MySQL에서는 다중 스레드, 다중 사용자 형식의 구조질의어 를 지원한다고 한다. 이런 부분이 MySQL에서 ServerEngine기능을 제공하는 부분이 아닐까 싶다.)

  • StorageEngine - 데이터를 Memory, Disk에 관리하는 방식을 의미한다. '디비 엔진을 InnoDB로 설정하세요' 라는 말은 Storage Engine을 InnoDB로 사용하라는 것이였다.

StorageEngine 종류

InnoDB, MyISAM, Memory, CSV, Archive, Blackhole, NDB, Merge, Federated 엔진이 존재한다고 한다. 이때 엔진의 종류에 따라 Lock을 지원 유무가 갈린다.

  • InnoDB : row-level의 lock을 지원 ( column)단위까지 락을지원, commit, roolback, crash-recovery등을 기본적으로 지원
  • MyISAM : table 수준의 lock을 지원, 대량의 데이터를 읽는데 유용하다. Transaction을 미지원하기에 readonly인 경우에 사용하는 것을 추천한다.
  • Memory : Memory에 데이터를 저장해서 빠르다. HEAP engine이라고도 불린다.
  • CSV : csv파일 형식의 데이터를 저장 index가 없다.
  • Archive : 이것도 index가 없다. 압축된데이터 저장에 유리하다고 한다.

InnoDB가 지원하는 Lock의 종류

Lock은 Transaction의 ACID원칙을 지키기 위해 사용되는 요소이다. 무조건적으로 사용되는것은(성능상의 이유로) 아니지만 아래의 Lock 개념을 통해서 Transaction을 구현하고 있다.

  • SharedLock : read시에 row단위로 걸리는 락, 해당 lock이 걸리면 다른 트랜잭션은 row를 수정,삭제가 불가능하다. 읽기는 가능
  • Exclusive Lock : update, delete시에 row단위에 걸리는 락, 해당 lock이 걸리면 다른 트랜잭션은 row에 접근이 불가능함
  • Intention Shared, Exclusive Lock : row에 락을 걸때 table에 row가 락에 걸릴 수 있다는 가능성을 말해두는것 (table 단위의 lock)

Intention Lock이 존재하는 이유

기술적으로 데이터 동시성을 유지하려면 최소 단위인 row lock만 얻으면 된다. 하지만 효율성을 따지기위해 intention Lock이 필요해진다. 이 효율성을 이해하려면 DB의 계층구조? 를 알아야 한다. DB -> Table -> Page -> Row 로 포함 관계를 가지는데, 만약 row 단위에 lock만 있는 상태에서 Table단위에 lock을 걸고 싶으면 아래 row에 모두 lock 상태를 확인해야 한다. 그렇기에 Table단위에도 lock을 걸어 효율성을 높이기 위해 intention lock이 존재한다.

Query에 따른 Lock

보통 위에서 말한 shared lock이나 exclusive lock은

SELECT * FROM table t FOR SELECT;
SELECT * FROM table t FOR UPDATE;

와 같이 명시적으로 LOCK을 건다 하지만 Query리 조건에 따라 자체적으로 아래와 같은 Lock이 걸릴 수 있다.

  • Record Lock : 쿼리가 primary or unique key로 조건이 걸어지면 해당 row들에 대해서만 lock을 검
  • Gap Lock : 쿼리가 index기반이 아닌 조건을 사용하면 row가아닌 조건심 범위에 lock을 검
  • Next Key Lock : 쿼리가 index 기반의 equal이 아닌 upper, lower 조건일 경우 최소, 최대 record를 찾아서 GapLock과 Record락을 같이사용해서 lock을 검
  • Insert intention Lock : insert시에 index의 범위를 지정하고 해당 범위에 intend lock을 걸어서 index가 중복되지만 않는다면 shared lock을 가지게 하는것 -> 성능은 좋지만 deadlock에 걸릴 수 있음
  • Auto INC lock : auto increment 옵션이 있는 column에 값을 할당 해 줄때 걸리는 lock이다. innodb에서 0,1,2 모드가 있다고 하는데 table 수준에 lock이 걸린다고 한다. 0, 1의 경우 auto increment 컬럼값에 임의값을 넣어주지 않는이상 순차적 증가를 기대 할 수 있다고 하는데 2번 모드는 아니라고 한다. 왜인지는 아직 이해가 가지 않는다..
profile
개발일기장

0개의 댓글