Lock이란?
아마존과 같은 다수의 사용자가 접속할때, concurrency를 관리하기 위해서 lock 사용
예시) E-commerce 웹사이트
첫번째 세션 - 물품 재고를 채우는 E-commerce 판매자
두번째 & 세번째 세션 - 물품을 사는 E-commerce 구매자
테이블
Wirte Lock ~ 테이블 전체에 대한 Lock
첫번째 세션에서 table write lock 실행 시, 두번째/세번째 구매자들의 쿼리는 lock이 해제될때까지 대기
트랜잭션 행에 대한 Lock
Transaction isolation level 이 READ-COMMITTED일 경우
좌측 판매자가 quantity 수량을 늘리고 commit이 완료되지 않으면, 같은 행에 대한 우측 구매자의 물품 구매 트랜잭션은 일정시간 초과 후 lock wait timeout 걸린다.
자세한 lock 정보는 아래 쿼리로 찾을 수 있다.
select * from performance_schema.data_locks;
InnoDB 데드락
교착 상태는 각 트랜잭션마다 다른 락이 있기 때문에 다른 트랜잭션을 진행할 수 없는 상황이다.
실행순서
(1) 첫번째 세션에서 id=1 quantity 업데이트 트랜잭션
(2) 두번째 세션에서 id=2 price 업데이트 트랜잭션
(3) 두번째 세션에서 id=1 price 업데이트 트랜잭션
(4) 첫번째 세션에서 id=2 quantity 업데이트 트랜잭션 ~ Deadlock
첫번째 세션의 트랜잭션은 rollback, 두번째 세션의 트랜잭션은 commit