해결된 질문
24.07.25 01:14 작성
·
69
0
"DeadLock 예시(2)"에서 INSERT구문이 UNIQUE를 보장하기위해 shared lock을 걸고 확인한다고하였는데요, 그냥 처음부터 exclusive lock을 걸고 값을 확인하게 구현할 수도 있을 것 같은데, 그렇게 안되어있는 특별한 이유가 있을까요?
exclusive lock을 건 상태에서는 값이 있는지 확인이 불가능하다 (shared lock을 걸었을때만 가능하다)
그냥 어쩌다보니 MySQL이 그렇게 구현되어있다.
lock경합을 줄이기위한 의도로 이렇게 구현했다?
제가 생각나는 이유는 위 2개 정도인데, 어떤 이유인지 아실까요?
답변 3
1
2024. 08. 12. 19:44
안녕하세요.
매우 중요한 질문을 주셨는데요.
UNIQUE INDEX가 있는 경우, INSERT를 실행할 때 먼저 중복된 레코드가 있는지 확인을 해야 하는데요.
만약 Exclusive Lock을 걸게 되면 동시 처리 성능이 떨어지게 되므로, 중복 레코드의 존재 여부까지는 Shared lock을 사용하는데,
만약 중복건이 있다면 Exclusive Lock이 필요치 않겠죠.
그리고 중복 건이 존재하지 않으면 INSERT를 수행 + INSERT 된 레코드에 Exclusive Lock을 거는 방법을 사용하게 됩니다.
감사합니다.
0
0
안녕하세요, 인프런 AI 인턴입니다.
hoon님의 질문과 특정 내용으로 직접 연결되는 정보는 제공된 정보 내에서 찾을 수 없습니다. 그러나 관련된 주제로 데이터베이스 락 관련 개념이나 전략에 대한 이해를 돕는 건강한 토론이나 공부 자료는 전문가 문헌이나 인터넷 공개 자료를 통해 확인하실 수 있습니다. 예를 들어, MySQL 공식 문서나 데이터베이스 관련 서적에서는 다양한 락(Lock) 메커니즘과 그 구현 방법에 대해 자세히 설명하고 있습니다. 이와 관련하여 Spring Data JPA나 Spring Data JDBC의 락 사용 방법을 예로 들 수 있으며, 각각의 참조 문서에서는 언제, 어떤 상황에서 락을 사용해야 하는지에 대한 지침을 제공합니다.
불행히도, hoon님께서 질문하신 ‘INSERT에서 shared lock을 사용하는 이유’에 대한 직접적인 대답을 드리지는 못하지만, 일반적으로 락의 사용은 데이터의 무결성과 일관성을 유지하기 위해 필수적인 부분입니다. MySQL에서 shared lock과 exclusive lock은 서로 다른 목적으로 사용됩니다. Exclusive lock은 데이터를 변경할 때 다른 트랜잭션의 접극을 막기 위해 사용되고, shared lock은 여러 트랜잭션이 동시에 데이터를 읽을 수 있도록 하면서도, 해당 데이터가 변경되는 것을 방지하기 위해 사용되는데, 이는 동시성을 높이면서도 데이터의 일관성을 보장하기 위한 전략 중 하나입니다.
특정 상황에서 MySQL이 왜 shared lock을 우선적으로 사용하는지는 MySQL의 내부 구현 로직과 성능 최적화 전략에 대한 깊은 이해가 필요하며, 이는 MySQL의 공식 문서나 데이터베이스 시스템에 대한 깊은 공부를 통해 더 자세히 알아볼 수 있습니다.
이와 관련하여 더 깊이 있게 공부하고 싶으시다면, MySQL 공식 문서나 데이터베이스 시스템 설계에 관한 서적을 참고해 보시는 것을 추천드립니다.