본문 바로가기
공부/Mysql

[RealMysql 8.0] 외래키 8.10 ~ 8.10.2

by 띵커베르 2023. 2. 26.
728x90
  • 외래키
    • InnoDB 의 왜래키 관리에는 중요한 두 가지 특징이 있다.
      • 테이블의 변경(쓰기 잠금)이 발생하는 경우에만 잠금 경합(잠금 대기)이 발생한다.
      • 외래키와 연관되지 않은 칼럼의 변경은 최대한 잠금 경합(잠금 대기)을 발생시키지 않는다.
  • 자식 테이블의 변경이 대기하는 경우
작업번호 커넥션-1 커넥션-2
1 BEGIN;  
2 update tb_parent set fb='changed-2" where id =2  
3   BEGIN;
4   update tb_child set pid = 2 where id = 100;
5 ROLLBACK;  
6   Query OK, 1 row affected (*.** sec)
  • -
    • 테이블의 변경(쓰기 잠금)이 발생하는 경우에만 잠금 경합(잠금 대기)이 발생한다.
      • 2번 커넥션 1 수행시 tb_parent 테이블에서 id 2인 레코드에 대해 쓰기 잠금을 획득한다.
      • 자식 테이블의 외래 키 칼럼의 변경(insert, update)은 부모 테이블의 확인이 필요한데, 이상태에서 부모 테이블의 해당 레코드가 쓰기 잠금이 걸려 있으면 해당 쓰기 잠금이 해제될 떄까지 기다리게 된다.
    • 외래키와 연관되지 않은 칼럼의 변경은 최대한 잠금 경합(잠금 대기)을 발생시키지 않는다.
      • 자식 테이블의 외래키(pid)가 아닌 다른 칼럼의 변경은 외래키로 인한 잠금확장이 일어나지 않는다.
  • 부모 테이블의 변경 작업이 대기하는 경우
작업번호 커넥션-1 커넥션-2
1 BEGIN;  
2 update tb_child set fb='changed-100" where id =100  
3   BEGIN;
4   delete from tb_parent where id = 1;
5 ROLLBACK;  
6   Query OK, 1 row affected (*.** sec)
  • -
    • 첫 번째 커넥션에서 부모 키 1을 참조하는 자식 테이블의 레코드를 변경하면 chiled 테이블의 레코드에 대한 쓰기 잠금을 회득
    • 4번 쿼리 수향시 child 테이블의 레코드에 대한 쓰기 잠금이 해제될 때까지 기다려야 한다.
    • 이는 자식테이블이 생성될 때 정의된 외래키의 특성(on create cascade) 떄문에 부모 래코드가 삭제되면 자식 레코드도 동시에 삭제되는 식으로 작동하기 때문
728x90

댓글