[컴] MySQL 의 LOCK IN SHARE MODE

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 MODEFOR UPDATE의 차이

LOCK IN SHARE MODEFOR 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 UPDATESERIALIZABLE에서라면 굳이 필요치 않다.

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 할 수 없다.

See Also

  1. MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking.
  2. What is difference between shared and exclusive lock?.
  3. Difference between Shared Lock and Exclusive Lock - GeeksForGeeks.
  4. mysql - When should I use shared lock over exclusive lock? -Database Administrators

댓글 없음:

댓글 쓰기