•
외래키는 InnoDB에서만 생성할 수 있으며 외래키 제약이 설정되면 자동으로 연관되는 테이블의 칼럼에 인덱스까지 생성됨, 외래키가 제거되지 않은 상태에서는 자동으로 생성된 인덱스를 제거할 수 없으며 외래키 관리에는 중요한 두 가지 특성이 존재한다.
◦
테이블의 변경이 발생하는 경우에만 잠금 경합이 발생
◦
외래키와 연관되지 않은 칼럼의 변경은 최대한 잠금 경합을 발생시키지 않는다.
1. 자식 테이블의 변경이 대기하는 경우
•
부모 테이블의 트랜잭션이 먼저 시작된 후, 커밋이 끝나지 않았을 때, 자식 테이블의 트랜잭션이 시작되고 변경 요청이 발생하는 경우
◦
이 경우, 부모 테이블의 트랜잭션이 부모 테이블의 특정 레코드에 쓰기 잠금을 획득하고 자식 테이블의 트랜잭션에서 해당 부모 테이블의 외래키 칼럼을 변경하는 쿼리를 진행할 경우, 부모 테이블의 작업이 끝나기를 기다리다 커밋이 되면 즉시 처리된다.
▪
즉 자식 테이블의 외래 키 칼럼의 변경은 부모 테이블의 확인이 필요한데 이 상태에서 부모 테이블의 해당 레코드가 쓰기 잠금이 걸려있으면 해당 쓰기 잠금이 해제될 때까지 대기한다.
2. 부모 테이블의 변경 작업이 대기하는 경우
•
변경하는 테이블의 순서만 변경되었을 때, 자식 테이블이 생성될 때 정의된 외래키의 특성 때문에 부모 레코드가 삭제되면 자식 레코드도 동시에 삭제되어야 하므로 만약 자식 테이블의 값이 변경되는 트랜잭션과 부모 테이블의 값이 삭제되는 트랜잭션이 경합할 경우, 부모 테이블의 트랜잭션은 자식 테이블의 쓰기 잠금이 해제되기를 기다려야 한다.