소개

Mysql 에서 외래키는 InnoDB 스토리지 엔진에서만 생성할 수 있으며, 외래키 제약이 설정되면 자동으로 연관되는 테이블의 칼럼에 인덱스까지 생성된다. 외래키가 제거되지 않은 상태에서는 자동으로 생성된 인덱스를 삭제할 수 없다.

  외래키 특징 
    1. 테이블의 변경(쓰기 잠금)이 발생하는 경우에만 잠금 경합(잠금 대기)이 발생한다.
    2. 외래키와 연관되지 않은 칼럼의 변경은 최대한 잠금 경합을 발생시키지 않는다. 

5.11.1 자식 테이블의 변경이 대기하는 경우

자시테이블의 외래키 칼럼의 변경(INSERT, UPDATE)은 부모 테이블의 확인이 필요한데, 이 상태에서 부모테이블의 해당 레코드가 쓰기 잠금이 걸려 있으면 해당 쓰기 잠금이 해제될 때까지 기다리게 되는 것이다. 이것이 첫번째 특징이다. 만약 자식 테이블의 외래키가 아닌 컬럼의 변경은 외래키로 인한 잠금 확장이 발생하지 않는다. 이것이 두번째 특징이다.

5.11.2 부모 테이블의 변경 작업이 대기하는 경우

첫번째 커넥션에서 부모키를 참조하는 자식테이블의 레코드를 변경하면 쓰기 잠금이 획든한다. 이 상태에서 두번째 커넥션에서 부모 테이블의 레코드를 삭제하려고하면 자식의 쓰기 잠금이 해제될 때가지 기다려야 한다. 이는 자식테이블이 생성될 때 정의된 외래키 특성(ON DELETE CASCADE) 때문에 부모 레코드가 삭제되면 자식 레코드도 동시에 삭제되도록 작동하기 때문이다.

데이터베이스에서 외래키를 물리적으로 생성하려면 이러한 현상으로 인한 잠금 경합까지 고려해 개발을 진행하는 것이 좋다.