반응형
대체적으로 RDBMS를 사용하다보면 Dead Lock에 빠지는 경우가 종종 있습니다.
해당 경우는 우리가 로직이 복잡해지고 다방면에서 들어오는 요청들이 한개의 Table이나 row에 대한 데이터 처리시에 사용한다고 하네요.
먼저 ACID와 MVCC 개념에 대해서 먼저 읽어 보시는걸 추천 드립니다. - https://paciencia.tistory.com/89
서버에서 보통 사용하는 InnoDB 기준으로 Lock이 걸리는 범위에 따라 지칭하는 명칭을 정리했습니다.
- Row 단위 Lock
- Shared Lock (s) : 읽는 요청시 해당 row의 수정을 막는 lock
- Exclusive Lock (X) : 수정 요청시 해당 row의 수정을 막는 lock
- 테이블 단위 Lock
- Intent Lock: 설명: 의도 잠금은 트랜잭션이 테이블 or 행에 대한 수정을 진행 할 때 사용하는 좀 더 넓은 범위의 lock
- Intent Shared Lock (IS) : 트랜젝션에서 테이블의 특정 row를 읽으려고 시도(SELECT) 하는 경우
- Intent Exclusive Lock (IX) : 트랜젝션에서 테이블의 특정 row를 읽으려고 시도(INSERT, UPDATE, DELETE) 하는 경우
- Intent Lock: 설명: 의도 잠금은 트랜잭션이 테이블 or 행에 대한 수정을 진행 할 때 사용하는 좀 더 넓은 범위의 lock
- 상황에 따른 Lock 종류
- Autocommit Lock : Autocommit 모드에서 트랜잭션이 자동으로 종료될 때
- Gap Lock : 쿼리에서 범위를 조건으로 하는 쿼리
- 예시 : SELECT * FROM TABLE WHERE id BETWEEN 1 AND 100
- Insert Intent Lock : INSERT 쿼리가 실행 될 때 InnoDB가 자동으로 범위를 지정하는데 이는 Gap Lock도 추가로 발생하며 다른 Transaction이 삽입되지 못하는 경우
- Advisory Locks : 사용자가 Mysql의 내장 함수를 통해 직접적으로 Lock을 걸거나 풀수 있는 행위를 뜻 함
- get_lock(), release_lock()... 등등
- Deadlock : 두개 이상의 Transaction이 서로를 바라보고 대기상태에 빠지는 경우
- 가장 많이 이슈로 구분되는 Lock 종류
- 트랜젝션의 격리 구분
- Transactional Locks이라는 명치을 사용하며 InnoDB상에서 ACID 개념을 적용한 트랜젝션이 발생시에 해당 행위에 대한 격리 처리를 나누는 개념
- READ UNCOMMITTED: 다른 트랜잭션이 커밋되지 않은 데이터도 읽을 수 있도록 적용이 필요할 때
- READ COMMITTED : 커밋된 데이터를 읽을 때 적용
- REPEATABLE READ : 같은 값을 여러번 읽을 때 적용
- SERIALIZABLE : 트랜잭션 간 충돌을 완전히 방지할 때 적용
- Transactional Locks이라는 명치을 사용하며 InnoDB상에서 ACID 개념을 적용한 트랜젝션이 발생시에 해당 행위에 대한 격리 처리를 나누는 개념
반응형