Skip to content

6조 240821 트랜잭션 학습

김수현 edited this page Aug 21, 2024 · 6 revisions

격리 수준 별 lock의 동작 방식 차이

사용한 쿼리

set autocommit = false;
start transaction;
select * from comment where id <= 2000000 and id %2 = 0 for update;
select * from comment;

SELECT * FROM performance_schema.data_locks;

rollback;
  • 참고로 for update 대신 for share를 사용하여 read lock을 걸어도 아래의 결과는 동일하다.

Read UnCommitted, Read Committed

  • Read Committed에서 for update문(write lock, x-lock)은 조건 절을 통해 레코드에 접근할 때 락을 걸고, 자신이 처리할 레코드가 아니면 즉시 락을 해제한다.-
스크린샷 2024-08-21 오후 2 05 08
  • SELECT ... FOR UPDATE를 실행하면, 해당 조건에 맞는 현재 상태의 데이터에만 배타적 잠금(X Lock)이 걸립니다. 즉, id < 10 AND id % 2 = 0인 조건에 맞는 행에 대해서만 X Lock이 설정됩니다.

  • 이는 READ COMMITTED가 트랜잭션 간의 간섭을 줄이기 위해 설계된 고립 수준이기 때문입니다. 트랜잭션은 변경된 데이터만을 대상으로 잠금을 설정하며, 커밋된 상태의 최신 데이터를 읽습니다.

  • 결과는 짝수 레코드에만 락이 걸린 것을 확인할 수 있다.

Repeatable Read, Serializable

  • Repeatable Read에서는 레코드에 락을 걸고, 조건절에 부합하지 않아도 락을 즉시 해제하지 않는다. 즉, 트랜잭션이 끝날 때까지 락을 유지한다.
    • 그래서 다른 트랜잭션이 홀수 번 레코드에 어떤 작업을 하려고 시도해도 읽기 및 변경이 불가능하게 된다.
스크린샷 2024-08-21 오후 2 05 30
  • 결과는 짝수,홀수 모두 락이 걸린 것을 확인할 수 있다.
  • SELECT ... FOR UPDATE를 실행하면, 조건에 맞는 모든 행에 대해 배타적 잠금(X Lock)을 설정합니다. 여기서 "모든 행"이란 id < 10 조건에 맞는 모든 행을 말합니다. 이 경우 조건이 id % 2 = 0인 행만 선택되어 처리되지만, 잠금은 id < 10인 모든 데이터에 걸리게 됩니다.
  • 이는 REPEATABLE READ가 트랜잭션이 읽은 데이터를 다른 트랜잭션이 수정하지 못하도록 보장하기 위해 설계되었기 때문입니다. 따라서 해당 범위 내의 모든 데이터에 잠금을 걸어 다른 트랜잭션의 변경을 막습니다.

공유 잠금과 배타 잠금

  • 배타 잠금은 읽기는 가능한데 수정이 불가능한것 x
  • 배타 잠금
    • select for update, delete, update 쿼리시 발생
    • 다른 트랜잭션이 읽거나 쓰지 못하게 함. 트랜잭션 내에서 특정 데이터를 읽고 이후에 수정할 계획이 있을때 사용.
  • 공유 자금:
    • shared lock은 허용되지만 exclusie lock은 불가능
      • select for share시에 걸림
      • 여러 트랜잭션이 데이터를 읽지만 수정할 수는 없도록 하기 위해서 사용
  • 공유잠금을 걸고 update할수는 없다. lock은 레코드가 수정되지 않기 위해서 거는건데 자신이 수정할 계획이 있다면 select for update를 걸어야한다.
  • 격리수준에 상관없이 공유잠금을 걸든 배타잠금을 걸든 다른 트랜잭션이 읽을 수는 있다.

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally