DB/Mysql

[Mysql] Transaction Row Lock 전파되는 경우?

hoonylab 2025. 4. 15. 11:18
728x90
반응형

🔐 MySQL 트랜잭션과 외래키(FK) - Row Lock 전파되는 경우?

MySQL에서 트랜잭션 중 Row Lock이 걸릴 때, 외래키로 연결된 다른 테이블에도 락이 전파될까?
결론부터 말하면, 명시적으로 접근하지 않으면 자동으로 락이 전파되지 않는다.


📌 기본 개념

  • MySQL(InnoDB)은 행 단위 잠금(Row-level Locking)을 사용
  • 외래키(Foreign Key)로 연결되어 있어도, 관련 테이블의 row에 자동으로 락은 걸리지 않음

CREATE TABLE parent (
  id INT PRIMARY KEY
);

CREATE TABLE child (
  id INT PRIMARY KEY,
  parent_id INT,
  FOREIGN KEY (parent_id) REFERENCES parent(id)
);

이 구조에서 parent row에 락이 걸려도, child 테이블 row에는 별도로 접근하지 않는 이상 락은 걸리지 않는다.


🔁 락이 전파되는 경우

1️⃣ 부모 row DELETE 또는 UPDATE

외래키 제약 조건에 따라 자식 row를 함께 수정하거나 삭제할 경우, 자식 row에도 락이 걸림


-- 자식 테이블에 CASCADE 설정된 경우
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE

예: 부모 row 삭제 시, 자식 row도 삭제됨 → 자식 row에 DELETE 락 발생

2️⃣ FK 제약 조건 확인 시

ON DELETE RESTRICT 와 같이 설정되어 있을 경우, 삭제 전 자식 테이블에서 관련 row가 있는지 확인

  • 이 과정에서 자식 테이블에 SELECT ... LOCK IN SHARE MODE 형태로 공유 락이 걸릴 수 있음

3️⃣ 트랜잭션 충돌 상황

두 트랜잭션이 부모-자식 테이블을 동시에 조작할 때 락 대기(Block)가 발생할 수 있음


Tx A: DELETE FROM parent WHERE id = 1;
Tx B: UPDATE child SET ... WHERE parent_id = 1;

→ 락 전파는 아니지만, 충돌로 인해 대기 현상이 발생할 수 있음


✅ 요약 표

상황 자식 테이블에 락 전파? 설명
ON DELETE/UPDATE CASCADE ✅ Yes 자식 row도 직접 변경됨 → 락 발생
ON DELETE RESTRICT 🔶 경우에 따라 제약 조건 확인을 위해 공유락 발생 가능
단순 FK 연결만 있을 때 ❌ No 자식 테이블에 접근 없으면 락 없음
트랜잭션 충돌 🔁 충돌로 대기 가능 락 전파는 아니지만 상호 영향 가능

💡 실무 팁

  • 트랜잭션 범위를 최소화하고 제약 조건(FK 설정)을 명확히 설정
  • SHOW ENGINE INNODB STATUS, INFORMATION_SCHEMA.INNODB_LOCKS 등으로 잠금 상태 확인

필요하다면 실습 예제도 추가해서 테스트해보는 걸 추천합니다 😊

728x90
반응형