Server

[비관적인락/PESSIMISTIC]_쓰기락과 읽기락

Raconer 2024. 2. 6. 00:33
728x90

동시성 제어를 위한 가장 보편적인 방법

락을 통한 줄세우기 (순차적인 실행)

중요_1!

  • 락을 통해 동시성을 제어할 때는, 락의 범위를 최소화 하는 것이 중요
    • 락을 유지 하는동안 다른 트랜잭션 또한 대기 하게 되고 그러면 서버 성능이 낮아 진다.
    • 최악의 경우에는 단일 쓰레드와 같은 효과를 볼수 있다.
    • Connection Pool을 관리 하는 경우에 Connection Pool 고갈이 발생할수 있다.

MySQL에서 락의 범위를 잡는 방법

MySQL에서는 트랜잭션의 커밋 혹은 롤백시점에 잠금이 풀린다.
즉. 트랜잭션이 곧 락의 범위 이다.
MySQL에서 락의 범위를 줄인다. == 하나의 트랜잭션을 최소화 한다

예) S3 업로드가 트랜잭션에 추가가 되어 있다

S3 업로드 하는 중에도 트랜잭션이 유지 되므로 S3업로드 와 같은 경우 최대한 트랜잭션 범위 밖에서 실행 하는것이 좋다.

쓰기락, 읽기락

MySQL에서는 쓰기락, 읽기락 두가지 잠금을 제공한다.

  읽기락(Shared Lock) 쓰기락 (Exclusive Lock)
읽기락(Shared Lock) O 대기
쓰기락 (Exclusive Lock) 대기 대기
  1. 읽기락이 되어 있고 또다른 읽기락이 들어올경우 공유(Shared)가 된다.
    • 읽기락이 되어 있고 또다른 읽기락이 들어온경우 데이터를 읽을 수 있다.
  2. 쓰기락 베타적인 락이므로 다른 락이 들어 오면 무조건 대기 상태가 된다.

명령어

  • 읽기락
    • 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시 불필요한 데이터들이 잠길수 있다.
  • 갭락 : ROW와 ROW사이에 락을 건다.
728x90