인프런 커뮤니티 질문&답변

dohyun_lim님의 프로필 이미지
dohyun_lim

작성한 질문수

Real MySQL 시즌 1 - Part 1

Ep.07 SELECT ... FOR UPDATE

7)select for update 강의에서 질문

해결된 질문

작성

·

49

0

안녕하세요 강사님 gpt o1에게 물어보다가 질문이 생겼습니다.

image.png

read committed 상태일 때 select for update를 쓰면 해당 statement가 끝나면 lock이 풀린다는데 이는 잘못된거지요?

답변 2

0

이성욱님의 프로필 이미지
이성욱
지식공유자

도현님 안녕하세요.

 

넵, AI가 알려준 내용은 잘못된 것입니다.

격리 수준에 관계없이 트랜잭션내에서 FOR UPDATE로 잠겨진 레코드는 트랜잭션이 완료되어야 잠금 해제됩니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. dohyun_lim님.

READ COMMITTED 격리 수준에서 SELECT ... FOR UPDATE 시 락 동작에 관해 궁금증을 가지셨군요.

제공해주신 이미지에서 설명한 대로, InnoDB에서의 기본 격리 수준(REPEATABLE READ)SELECT ... FOR UPDATE 시 next-key locks를 사용하며, 이 락은 트랜잭션이 종료될 때까지 유지됩니다. 이를 통해 다른 트랜잭션이 해당 락이 걸린 행 또는 범위를 수정하지 못하게 하여 데이터 일관성을 보장합니다.

READ COMMITTED 격리 수준에서는 InnoDB가 gap locks를 최소화하여 더 높은 동시성을 제공합니다. 이 경우, 행 잠금(record locks)만 사용되며, 이 잠금은 해당 statement가 끝날 때 해제됩니다. 여기서 주의할 점은 데이터 일관성을 유지하기 위해 외래 키 제약 조건 확인 및 중복 키 확인 시에는 여전히 gap locks가 동작할 수 있습니다. 결과적으로, SELECT ... FOR UPDATE에서 READ COMMITTED에서는 statement 수준에서 잠금이 해제되므로 다른 트랜잭션이 보다 빨리 접근할 수 있게 됩니다.

즉, 도현님께서 말씀하신 대로 READ COMMITTED에서 SELECT ... FOR UPDATE를 수행하면 statement 종료 시점에 락이 풀리게 됩니다. 이는 InnoDB의 expected behavior입니다.

관련하여 더 구체적인 설명이 필요할 경우 아래 링크를 참고하시면 도움이 될 것 같습니다.
* Select for update locking
* Optimistic Lock 경우 이런 케이스일때는 Lost Update 문제 발생 될수 있지 않나요???

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dohyun_lim님의 프로필 이미지
dohyun_lim

작성한 질문수

질문하기