mysql 락 관련한 질문 드립니다! 0 0 379

by rmsja10 [MySQL] [2020.07.10 02:23:49]


안녕하세요 실전 마이에스큐엘 책을 통해 공부하다가 이해가 안가는 부분이 있어 문의 드립니다.

맘같아서는 책을 사진찍어 올리고 싶은데 문제가 될까 싶어 글로 적어봅니다. 밤에 잠결에 질문를 폰으로 적느라 이해가 안되는 내용이 있으시면 댓글 주시면 예시도 추가하도록 하겠습니다.

 

제가 아는 전제 조건을 먼저 말씀드리면 인서트 쿼리는 언듀(스냅샷)을 생성하지 않는다. select for update는 조회 대상 인덱스로우에 락을 건다 입니다.

 

트랜젝션1 에서 먼저 select를 합니다.(1번 셀렉트)

 

트랜젝션2에서 특정 로우를 추가합니다. 이 로우는 1번 셀렉트 조건에 일치합니다. (where조건상 검색이 가능) 그리고 커밋을 합니다.

 

트렌젝션1은 아직 진행중이므로 다시 한번 1번 셀렉트와 같은 조건으로 for update로 실행한다.

 

이 경우 phantom read가 발생한다는 내용이고 그에 대한 설명이 두번째 select에서 for update로 데이터를 가져오려 했기 때문에 undo 에 락을 걸려다가 실패 했고 그에 따라 undo가 아닌 최신 데이터를 가져왔다 라고 나와잇는거 같습니다. (제가 이해한게 맞다면요...)

 

이에 대한 질문인데요.

두번째 select에서 언듀를 읽으려고 한건 repeatable read가 기본인 mysql에서 트랜젝션 1의 시작보다 이후에 시작된 트랜젝션2에서 삽입한 데이터는 조회대상이 아니어서 언듀 로그를 읽으려 한게 맞나요? repeatable read일 경우 자기보다 낮은 트랜젝션 번호를 가진 언두중 가장 높은 번호를 가져온다고 알고 있어서 이렇게 생각했습니다.

 

다음 질문으로 두번째 select가 for update기 때문에 언듀에 락을 거는것이 실패햇다고 나오는데요. 제가 알고잇는 것과 같이 insert는 언듀를 생성하지 않아서 대상이 없어서 실패한게 맞는건가요?

 

마지막 질문으로 undo로그에 락을 거는게 실패할 경우에 무조건 자기보다 늦게 실행한 트랙젝션이 삽입한 데이터를 가져오는게 기본 mysql의 메카니즘인가요?

 

밤중에 공부하다 이리저리 찾아도 보고 이해가 안되서 질문드립니다 소중한 답변 부탁드립니다

 

좋은 밤되세요!

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입