InnoDB 를 로우레벨 락킹을 할려고 합니다.
먼저 클라이언트(세션)를 두개 뛰워 놓았습니다.
그리고 먼저 세션A에서 아래와 같이 입력했습니다.
-----------------------------------------------------------------
<세션A>
mysql> set autocommit=0;
mysql> select * from vc_test for update;
대기...
<세션B>
mysql> select * from vc_test where addr="춘천";
-----------------------------------------------------------------
위와 같이하면 <세션B> 의 select * from vc_test; 이 구문이 <세션B>가 끝날때 까지 실행이 대기상태로 있거나 아니면 아예 실행이 되지 않아야 하는 것 아닌가요?
즉, <세션A> 의 select 문에서 마지막에 for update를 붙이게 되면 다른 세션들의 select, insert, update, delete 문에 대하여 배타적 우선권이 생기기 때문에 다른 세션 모두 실행 대기 상태가 되어야 하는 것이 아닌가요?
다시 말씀드리면 다른 세션의 insert, update, delete 문에 대하여는 배타적 잠금이 생기나 오직 select 문에 대하여는 배타적 작금이 생기지 않습니다.
그러나 위 <세션B> 의 select 문 끝에 for update를 붙여서 mysql> select * from vc_test where addr="춘천" for update; 와 같이 하면 <세션A>의 실행이 끝날때 까지 대기 상태가 되어 지는대 꼭 select문 끝에 for update 가 붙어 이는 경우에만 배타적 잠금이 생긴다는 문제점이 이쉽네요.
결국 LOCK IN SHARE 와 FOR UPDATE 라는 키워드의 차이점이 없는 것 같습니다.
혹시 제가 질못 알고 있는 것인가요?
저와 같은 질문을 한 곳이 있어군요: http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=174986
이 문제를 잘 아시는 분은 답변 좀 부탁드립니다. |