728x90
- 외래키
- InnoDB 의 왜래키 관리에는 중요한 두 가지 특징이 있다.
- 테이블의 변경(쓰기 잠금)이 발생하는 경우에만 잠금 경합(잠금 대기)이 발생한다.
- 외래키와 연관되지 않은 칼럼의 변경은 최대한 잠금 경합(잠금 대기)을 발생시키지 않는다.
- 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
'공부 > Mysql' 카테고리의 다른 글
[RealMysql 8.0] 고급 최적화 9.3 ~ 9.4.12 (0) | 2023.02.27 |
---|---|
[RealMysql 8.0] 옵티마지어와 힌트 9 ~ 9.2 (0) | 2023.02.26 |
[RealMysql 8.0] 인덱스 8.3.5 ~ 8.9.2 (0) | 2023.02.07 |
[RealMysql 8.0] 인덱스 8.3.4 ~ 8.3.4.4 (0) | 2023.02.07 |
mysql 인덱스 테이블 정보, show index from 테이블 정보 (0) | 2023.02.07 |
댓글