InnoDB 는 row 기반의 잠금 방식을 탑재하고 있어 훨씬 뛰어난 동시성을 제공한다.

비관적(Pessimistic) 잠금(현재 변경하고자 하는 레코드를 다른 트랜잭션에서도 변경할 수 있다는 가정하에 먼저 Lock을 걸고 작업하는 방식) 을 채택하고 있다.

이 포스트에서는 "락의 적용 요소"에 따른 분류로 구분하여 정리하였으며, 다음 포스팅에서는 "락이 적용되는 상황"에 따른 분류로 포스팅하겠다.

 

 

* Shared Lock (읽기락) 을 읽을 때 사용된다.

  - 한 트랜잭션의 특정 로우를 읽을 때 s락이 걸리고, 다른 트랜잭션에서는 해당 로우에 s락을 동시에 적용할 수 있지만 x락은 불가하다.

  - S락을 획득하려면, 먼저 테이블에서 IS락 이상을 획득해야 한다.

 

* Exclusive Lock (쓰기락) 을 업데이트하거나 삭제할 때 사용된다.

- 한 트랜잭션에서 특정 로우를 변경할 때 x락이 걸리고, 해당 트랜잭션이 완료될 때까지 다른 트랜잭션에서는 해당 로우에 s락과 x락 모두 적용할 수 없다.

- "Lock Tables ... Write" 같은 명령문은 지정된 테이블에서 x락을 사용한다.

- X락을 획득하려면, 먼저 테이블에서 IX락을 획득해야 한다.

 

* Intention Lock은 트랜잭션이 테이블의 row에 대해 나중에 필요한 s락 또는 x락을 나타내는 테이블 수준의 락이다.

> IS락 : 트랜잭션이 테이블의 개별 row에 s락을 설정하려고 한다는 '의도'를 나타낸다.

- ex) "SELECT ...LOCK IN SHARE MODE" 가 실행되면, 해당 table에 IS락이 걸리고, 이후에 row에 S락이 걸린다.

> IX락 : 트랜잭션이 테이블의 개별 row에 x락을 설정하려고 한다는 '의도'를 나타낸다.

- ex) "SELECT ...FOR UPDATE"가 실행되면, 해당 table에 IX락이 걸리고, 이후에 row에 X락이 걸린다.

 

** 각 요소 호환성

- IS락, IX락은 여러 트랜잭션에서 동시에 접근이 가능하며, 서로 block 하지 않는다.

- Lock tables, Alter table, Drop table 이 실행될 때는 IS,IX를 모두 block 하는 테이블 락이 걸린다. 즉, IS, IX락을 획득하려는 트랜잭션은 대기상태로 빠진다.

 

 

 X락은 무조건 충돌

 S락은 X락, IX락과 충돌      => 행을 읽을 때 S락 걸려있으면, 다른 세션에서는 X락, IX락(table)을 잡을 수 없다.

 IS락은 X락만 충돌              => 행을 읽기 위해 (S락 설정하기 전에) 테이블에 IS락이 잡혀있다면, 다른 세션에서는 row에 X락을 잡을 수 없다.

 IX락은 X락, S락 둘다 충돌  => 행을 변경하기 위해 (X락을 설정하기 전에) 테이블에 IX락이 잡혀있다면, 다른 세션에서는 해당 row에 X락, S락을 잡을 수 없다.

 

Print Friendly and PDF Posted by JJ*
: