728x90
동시성 제어를 위한 가장 보편적인 방법
락을 통한 줄세우기 (순차적인 실행)
중요_1!
- 락을 통해 동시성을 제어할 때는, 락의 범위를 최소화 하는 것이 중요
- 락을 유지 하는동안 다른 트랜잭션 또한 대기 하게 되고 그러면 서버 성능이 낮아 진다.
- 최악의 경우에는 단일 쓰레드와 같은 효과를 볼수 있다.
- Connection Pool을 관리 하는 경우에 Connection Pool 고갈이 발생할수 있다.
MySQL에서 락의 범위를 잡는 방법
MySQL에서는 트랜잭션의 커밋 혹은 롤백시점에 잠금이 풀린다.
즉. 트랜잭션이 곧 락의 범위 이다.
MySQL에서 락의 범위를 줄인다. == 하나의 트랜잭션을 최소화 한다
예) S3 업로드가 트랜잭션에 추가가 되어 있다
S3 업로드 하는 중에도 트랜잭션이 유지 되므로 S3업로드 와 같은 경우 최대한 트랜잭션 범위 밖에서 실행 하는것이 좋다.
쓰기락, 읽기락
MySQL에서는 쓰기락, 읽기락 두가지 잠금을 제공한다.
읽기락(Shared Lock) | 쓰기락 (Exclusive Lock) | |
---|---|---|
읽기락(Shared Lock) | O | 대기 |
쓰기락 (Exclusive Lock) | 대기 | 대기 |
- 읽기락이 되어 있고 또다른 읽기락이 들어올경우 공유(Shared)가 된다.
- 읽기락이 되어 있고 또다른 읽기락이 들어온경우 데이터를 읽을 수 있다.
- 쓰기락 베타적인 락이므로 다른 락이 들어 오면 무조건 대기 상태가 된다.
명령어
- 읽기락
- SELECT .... FOR SHARE
-
SELECT * FROM your_table WHERE your_condition FOR SHARE;
- 쓰기락
- SELECT .... FOR UPDATE 또는 UPDATE, DELETE 쿼리
-
SELECT * FROM your_table WHERE your_condition FOR UPDATE;
-
UPDATE your_table SET column1 = value1 WHERE your_condition;
-
DELETE FROM your_table WHERE your_condition;
매번 잠금이 발생할 경우, 성능 저하를 피할수 없다.
MySQL에서 일반 SELECT는 nonblocking consistent read로 동작(대기 없는 READ란 뜻)
14.7.2.3 Consistent Nonlocking Reads
중요_2!
쓰기락, 읽기락 외에도 락 범위에 따라서 여러가지 종류의 락이 있다.
- 테이블 락 : 테이블 전체에 락을건다.
- 레코드 락 : ROW하나에 락을 건다. 가장 중요
- MySQL은 다른 RDBMS와 다르게 ROW가 아니라 INDEX에 Lock을 건다.
- 인덱스가 없는 조건으로 Locking Read시 불필요한 데이터들이 잠길수 있다.
- MySQL은 다른 RDBMS와 다르게 ROW가 아니라 INDEX에 Lock을 건다.
- 갭락 : ROW와 ROW사이에 락을 건다.
728x90
'Server' 카테고리의 다른 글
[낙관적락/Optimistic Lock]_기본 개념 (비관적 락/PESSIMISTIC 짧은 설명 포함) (0) | 2024.02.15 |
---|---|
[비관적인락/PESSIMISTIC]_쓰기락 테스트 (0) | 2024.02.06 |
[디자인 패턴] 추상 팩토리 패턴 (0) | 2024.02.03 |
CAP 이론 (0) | 2024.02.03 |
낙관적인락(Optimistic Locking) / 비관적인(Pessimistic Locking) (0) | 2023.08.09 |