InnoDB는 트랜잭션, 행 잠금 및 테이블 잠금을 지원합니다. MyISAM은 트랜잭션을 지원하지 않고 테이블 잠금만 지원합니다. 여기서는 InnoDB만 소개합니다.
InnoDB는 다음 두 가지 유형의 행 잠금을 구현합니다.
공유 잠금(S): 하나의 트랜잭션이 행을 읽을 수 있도록 허용하고 다른 트랜잭션이 동일한 데이터 세트에 대해 배타적 잠금을 획득하는 것을 방지합니다.
배타적 잠금(X): 배타적 잠금을 획득한 트랜잭션이 데이터를 업데이트하도록 허용하고, 다른 트랜잭션이 동일한 데이터 세트에 대해 공유 읽기 잠금 및 배타적 쓰기 잠금을 획득하지 못하도록 합니다.
또한 행 잠금과 테이블 잠금이 공존할 수 있도록 하고 다단계 잠금 메커니즘을 구현하기 위해 InnoDB에는 내부적으로 사용되는 두 가지 의도 잠금(Intention Locks)도 있습니다. 자물쇠는 테이블 자물쇠예요.
의도 공유 잠금(IS): 트랜잭션은 공유 잠금을 추가하기 전에 먼저 테이블의 IS 잠금을 데이터 행에 추가하려고 합니다. 데이터 행.
의도 배타적 잠금(IX): 트랜잭션은 배타적 잠금을 추가하기 전에 먼저 테이블의 IX 잠금을 획득해야 합니다. 데이터 행.
InnoDB 행 잠금 모드 호환성 목록
X |
IX |
S |
IS |
| |||||||||||||||||||||||||
X | 충돌 | 충돌 | 충돌 | 충돌 | |||||||||||||||||||||||||
IX | 충돌 | 호환 가능 | 충돌 | 호환 가능 | |||||||||||||||||||||||||
S | 충돌 | 충돌 | 호환 가능 | 호환 가능 | |||||||||||||||||||||||||
IS | 충돌 | 호환 가능 | 호환 가능 | 호환 가능 |
공유 잠금(S): SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE.
배타적 잠금(X): SELECT * FROM table_name WHERE ... FOR UPDATE.