MySQL / mariadb / db lock / row lock / read lock / write lock /
MySQL 의 LOCK IN SHARE MODE
SELECT ... LOCK IN SHARE MODE
‘읽으려는 row’ 에 lock 을 건다. 그래도 다른 session 들이 read 를 할 수 있다. 다만, update, delete 를 할 수 없다. 만약 현재 ‘읽으려는 row’ 를 변경시킬 수 있는 transaction 이 아직 commit 되지 않고 남아있다면, 이 transaction 이 끝나고 나서 read 를 하게 된다.
참고로 MySQL 8.x 에서는 FOR SHARE
로 이름이
변경됐다.
LOCK IN SHARE MODE
와 FOR UPDATE
의 차이
LOCK IN SHARE MODE
와 FOR UPDATE
모두 row
를 read 하는 동안 modify 를 못하게 막는 역할을 한다.
LOCK IN SHARE MODE
는 다른 transaction 이 row 를 읽는 것을
막지 않는다.(shared lock) FOR UPDATE
는 transaction 이 read
하는 것을 막는다.(exclusive lock)
위의 글에서 쉽게 설명한 내용을 가져오면 2개의 차이점은
LOCK IN SHARE MODE
는 이 transaction 동안에 값을 변경하는 부분이 없다고 mysql 에 알려준다. 그러니 이것을 read 해도 문제가 없다.FOR UPDATE
는 이 transaction 에서 나는 이 row 를 변경할 것이라고 mysql 에 알려주는 것이다. 그러니 이 row 를 지금 read 하지 마라.
참고로 이 lock 은 isolation level 과 관련이 있다. (참고)
FOR UPDATE
는 SERIALIZABLE
에서라면 굳이
필요치 않다.
shared lock 과 exclusive lock
shared lock (LOCK_S), exclusive lock (LOCK_X) 의 차이는 다음 글에서 잘 설명한다. 간략하게 이야기하면, shared lock 은 여러개 존재할 수 있다. 그런데, 이 shared lock 이 있으면, exclusive lock 을 얻을 수 없다. shared lock 이 다 release 되면, exclusive lock 을 얻을 수 있다. exclusive lock 이 걸려있으면, shared lock 을 acquire 할 수 없다.
댓글 없음:
댓글 쓰기