이번 포스트에서는 row lock에대해서 더 상세히 살펴보겠습니다.
트랜잭션이 row lock을 획득하게 되면, 동시에 intention lock이라고 하는 것도 획득하게 됩니다.
그런데, 이 intention lock이라고 하는 것은 왜 사용하는 것일까요?
intention lock은 테이블 레벨의 lock이고, 트랜잭션에서 테이블의 row 를 조작하기 위해서 S와 X lock중에서 어떤 lock을 사용하고 있는 지를 알려줍니다.
itention lock에는 2가지 종류가 있습니다.
- intention share lock (IS)
intention lock이 IS인경우에는 테이블의 row에 접근하는 트랜잭션이 S lock 이라는 의미입니다. - intention exclusive lock (IX)
intention lock이 IX인경우에는 테이블의 row에 접근하는 트랜잭션이 X lock 이라는 의미입니다.
아래표는 table lock과의 호환성을 정리한 표입니다.
| X | IX | S | IS | |
| X | Conflict | Conflict | Conflict | Conflict |
| IX | Conflict | Compatible | Conflict | Compatible |
| S | Conflict | Conflict | Compatible | Compatible |
| IS | Conflict | Compatible | Compatible | Compatible |
출처) https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
위의 표를 보면 예를 들어서 트랜잭션이 row에 대해서 update나 insert 처리를 하는 상태(IX)에서는 테이블에 대해서 X lock을 거는 것이 Conflict가 발생된다는 것을 알 수 있습니다. 정리하자면, intention lock은 row lock과 table lock 을 동시에 처리하기 위해서 설정해 놓는 플래그와 같다고 생각하면 될 거 같습니다.
또한, intention lock은 목적이 어떤 트랜잭션에서 row lock을 걸고 있고, row lock을 걸지에 대한 정보를 알려주는 것이라서, LOCK TABLES ... WRITE이나 스키마 변경과 같은 전체 테이블에 대한 요청이외에는 block하지 않습니다.
참고로 아래 명령의 출력에도 S와 X말고 IS와 IX도 출력됩니다.
SHOW ENGINE INNODB STATUS;
'MySQL > Lock' 카테고리의 다른 글
| MySQL Lock (5) Gap Locks (0) | 2021.09.29 |
|---|---|
| MySQL lock (4) Record Lock (0) | 2021.09.29 |
| MySQL lock (2) 개별row에 대한 잠금(row lock) (3) | 2021.09.28 |
| MySQL Lock Deadlock (1) 기본편 (5) | 2021.09.28 |
| MySQL lock (1) 테이블에 대한 잠금(table lock) (3) | 2021.09.26 |