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
반응형