개발 관련 일지

메타 데이터 락

worldi 2024. 4. 10. 04:13

배경

메타 데이터락을 공부하던 도중, 의문점이 들었습니다 

  • 문제의 코드입니다.


    다음의 코드는 access_log의 구조를 바꾸기 위해 access_log_new를 생성하여 access_log의 데이터를 옮기고, access_log_new를 다시 access_log 로 만드는 과정입니다.

궁금증

  1. P166의 중반부에 있는 예제에서 '트랜젝션을 autocommit으로 실행(BEGIN 이나 START TRANSACTION으로 실행하면 안됨)' 라고 적혀있는데 왜 그럴까요? start commit 을 쓰면 안되는 이유가 있을까요?

공식문서에 따르면, 트랜젝션을 시작하게 되면(start transaction..등) 기존에 있었던 UNLOCK TABLE 이 수행됩니다. 이는, 코드를 보면 중간에 commit을 통해서 트랜젝션이 끝나게 됩니다. (이는 access_log의 내용이 access_log_new에 반영되어야 되기 때문에 꼭 필요한 작업입니다.) 하지만 이후, start transaction을 하게 되면 unlock을 통해서 기존에 잡혀 있던 쓰기락이 풀리게 되므로 원치않는 결과를 초래합니다.. 😢

그렇다면 set autocommit을 하여, 반영 사항을 그대로 커밋시키면 안될까요?

공식문서에 따르면, set autocommit=1을 할 시, 테이블 락을 걸게 되면 deadlock을 피하기 위해 innoDB에서는 내부적인 테이블 락을 놓게 된다고 합니다. 따라서 이는 사용할 수 없겠네요!

  1. 메타 데이터 락은 묵시적으로 실행될 때 어떤 락(readlock, writelock) 이 걸릴까요?
    write lock이 걸린다고 합니다. 생각해봐도 테이블의 구조가 바뀌는데 이전의 메타 데이터를 가져 오면 안되겠죠??
  2. access_log는 쓰기 잠금을 하는 것은 알겠는데 왜 access_new_log 또한 쓰기 잠금을 하는 걸까요? (이전 페이지에서는 여러개 쓰레드 동시 돌릴려고 쓰기 잠금 안걸음)

4개의 쓰레드가 돌 때, 테이블에 대한 쓰기락을 안걸었는데 왜 rename 과정때 access_new_log 에 쓰기 잠금을 했을 까요?
테이블의 이름이 바뀌는 과정은 다음과 같습니다.

<테이블 이름 바뀌기 전>

<테이블 이름 바뀐 후>

다음과 같이, 테이블의 이름이 access_log_new 에서 access_log로 테이블이 바뀌게 됩니다. 그럼 이때 access_log에는 쓰기락이 걸리지 않은 상태이고, 이때 insert 과 같이 테이블 변경 작업을 하게된다면..? 이또한 원치않는결과를 초래하게 될 것입니다! 😃

  1. 테이블 락이 걸릴 때, 메타 데이터 락도 걸린다?

테이블 락에 대해 공부를 하다가, 테이블 락이 걸릴 때 메타 데이터 락이 동반된다는 것을 알게 되었습니다 😉

참고 자료

https://dev.mysql.com/doc/refman/5.7/en/lock-tables.html
https://dev.mysql.com/doc/refman/5.7/en/metadata-locking.html
https://dev.mysql.com/doc/refman/8.0/en/commit.html

'개발 관련 일지' 카테고리의 다른 글

BFF 패턴  (1) 2024.01.22
인수테스트와 시스템 테스트  (0) 2024.01.22