이번 포스트에서는 transaction과 관련된 select for update, select for share에 대해 살펴보자.
select for update
필요한 이유
재미있는 영화가 개봉을 해서 예매를 하려는 상황을 생각해보자. 좌석을 조회했더니 마침 1석이 남아있었다. 볼까 말까 고민하다가 예매을 누르고 들어갔는데 느닷없이 이매 예매된 좌석이라고 나온다면 아주 황당할 것 같다. "이럴꺼면 애초에 왜 조회가 된거야?" 라는 불만이 나올만 하다.
좌석의 상태를 변경(예매) 하기위해서 조회한 내용이라면 보호되어야 하는거 아닐까?
select for update
위와 같은 경우 생각해볼 수 있는 쿼리가 select for update이다. select for update는 데이터에 대한 x-lock을 갖는다.
tx1
tx2
tx1은 update할 예정인 데이터를 확인하기 위해 select for update 문장을 실행한다. 그리고 select임에도 불구하고 data에는 lock이 걸리게 된다.
물론 T.X 하에서 tx2가 동일하게 업데이트를 목적으로 조회하면 lock에 의해 멈추게 된다.
조회를 위한 select for share도 역시 동작하지 않는다.
하지만 단순 select는 lock을 확인하지 않기 때문에 전혀 문제가 없다.
select for share
select for share는 lock을 확인하면서 데이터를 조회하기 위해서 사용한다. select for share는 s-lock을 갖는다.
tx1
tx2
select for update는 당연히 동작하지 않는다. x-lock을 가져야 하는데 이미 s-lock이 설치되었기 때문이다.
select for share는 가능하다. 따라서 tx1과 tx2가 서로 안정적인 데이터 조회가 가능하다.
일반 select도 당연히 문제가 없다.
애초에 select로 하기로 하고 share 했기 때문에 TX2는 물론 TX1도 동일하게 update를 실행할 수는 없다.