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

lch9502님의 프로필 이미지

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

Pessimistic Lock 활용해보기

Pessimitic Lock 과 Optimitic Lock 질문

작성

·

245

·

수정됨

0

안녕하세요, 강의를 듣다가 몇가지 질문이 생겼습니다.

1. Pessimitic Lock와 Optimitic Lock 는 select 구문(@Query("select ...) 나 find 쿼리메서드)에서만 @Lock을 적용하는거라고 이해하면 될까요?

2. Pessimitic Lock 과 Optimitic Lock 의 벌크 수정 쿼리는 어떻게 처리가 되는건가요?
2-1. Pessimitic Lock 은 select 절로 데이터를 가져오지 않는다면 어떻게 벌크 수정이 되는건가요?
2-2. Optimitic Lock 은 벌크 연산에서 직접 버전을 수정하는게 맞을까요?

좋은 강의 감사합니다.

답변 2

0

최상용님의 프로필 이미지
최상용
지식공유자

lch9502 님 안녕하세요.

제가 이해력이 조금 부족하여 질문을 이해하지 못한듯합니다.
두 질문 모두 조금만 더 자세하게 설명을 해주실 수 있으실까요 ?

lch9502님의 프로필 이미지
lch9502
질문자

제가 궁금했던 것을 좀 자세하게 설명드리면,

  1. @Lock 을 사용하는 위치에 대한 질문이였습니다. 강의에서 사용하신 예시는 select 절에서만 @Lock 을 사용하셨는데요, insert, update, delete 절에도 @Lock을 사용할 수 있는지 궁금했습니다.

  2. Pessimitic Lock 과 Optimitic Lock를 사용하여 벌크성 수정 쿼리를 처리하는 방법에 대한 질문이였습니다. 벌크성 수정 쿼리도 잠금을 해야되는 상황이 온다면 Pessimitic Lock 과 Optimitic Lock을 걸 수 있는지 궁금했고, 만약 걸 수 있다면 어떻게 Pessimitic Lock 과 Optimitic Lock을 걸어서 처리할 수 있는지 궁금했습니다.

    1. 벌크성 수정 쿼리에서 select로 엔티티를 영속성 컨텍스트에 넣어서 사용하기 보다는 그냥 PK등을 사용하는게 낫다고 생각하는데 Pessimitic Lock를 걸기 위해서 무조건 row들에 대한 select가 우선시 되야하는건지, 만약 select를 하게 되면 select를 한 row들은 다 Pessimitic Lock이 걸린 상태로 봐야하는지 궁금합니다.

    2. 벌크성 수정 쿼리에서 Optimitic Lock을 사용한다면 직접 버전을 증가시키는 쿼리를 작성해야하는지 궁금합니다.

 

저도 동시성 관련해서 처음 학습하는거라 질문의 방향이 옳은 방향인지는 잘 모르겠습니다... 실무에서 어떻게 사용하는지 모르기에 의미 있는 질문인지도 모르겠구요.. 추가적으로 AI 인턴의 답변이 정답이라고 생각해도 될까요?

최상용님의 프로필 이미지
최상용
지식공유자

lch9502 님 답변이 늦어져서 죄송합니다.
1. Lock 어노테이션의 경우엔 Spring + JPA 환경에서는 select 절에만 가능한 것으로 알고있습니다. optimistic lock 같은경우엔 @Lock 어노테이션 없이 update ~~ from temp where version = :version 과 같은식으로 사용 가능합니다.

  1. 벌크성 수정쿼리를 작업해야 할 때 Pessimistic lock 같은경우 모든 row 에 대해 잠금을 획득하게 됩니다. Optimistic lock 은 명시적으로는 락을 획득하지 않으며 업데이트 쿼리 실행시점에 버전을 명시해서 제어해주어야 합니다. (update ~~ from temp where version = :version 와 같이 말입니다)

    1. Pessimistic lock 을 위해서는 select for update 구문을 활용하여 락과 함께 데이터를 가지고 와야합니다. 자세한 내용은 https://dev.mysql.com/doc/refman/8.4/en/innodb-locking-reads.html 문서의 select for update 부분을 살펴보시면 도움 되실 것 같습니다.

    2. 직접 버전을 증가시키는 쿼리를 작성해야 하여야 합니다!

다시 한번 답변이 늦어져서 죄송합니다.
추가적인 질문이 있다면 질문 부탁드릴게용!

0

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

lch9502님의 질문에 답변드립니다.

  1. Pessimistic Lock과 Optimistic Lock은 일반적으로 데이터 조회 시에만 적용되지는 않습니다. 예를 들어, Pessimistic Lock은 데이터를 조회할 때 뿐만 아니라, 데이터를 변경하기 전에 해당 데이터에 대한 Lock을 걸어 다른 트랜잭션이 해당 데이터를 변경하지 못하도록 할 때 사용될 수 있습니다. Optimistic Lock은 데이터를 업데이트하거나 삭제할 때 버전 정보를 함께 확인하여 동시성을 제어합니다.

  2. Pessimistic Lock의 경우, 벌크 수정 쿼리에 직접 적용하기 어려울 수 있습니다. 이는 Pessimistic Lock이 특정 레코드에 대한 직접적인 Lock을 요구하기 때문이며, 벌크 처리에서는 여러 레코드를 동시에 처리해야 할 필요가 있기 때문입니다.

2-1. Pessimistic Lock이 적용된 벌크 수정의 경우, 대개 먼저 데이터를 select 절을 통해 가져온 후 해당 데이터에 대한 Lock을 걸고 벌크 수정을 수행합니다. 이는 Pessimistic Lock이 데이터를 가져오는 단계에서 적용되기 때문입니다.

2-2. Optimistic Lock의 경우, 벌크 연산에서도 버전 관리가 필요합니다. 벌크 연산을 수행할 때는 보통 버전 정보를 함께 체크하고, 해당 연산이 적용될 모든 레코드의 버전을 업데이트하여 Optimistic Lock을 유지합니다. 이는 데이터베이스 상태의 변화를 정확히 반영하기 위함입니다.

더 자세한 내용은 Spring Data JDBC에서 제공하는 문서를 참조하시는 것도 좋은 방법입니다. Optimistic Locking에 대한 좀 더 상세한 정보는 아래 링크에서 확인하실 수 있습니다.

이러한 메커니즘을 이해하고 적절히 활용한다면, 복잡한 동시성 이슈를 해결하는 데 큰 도움이 될 것입니다. 좋은 질문 감사드리며, 항상 도움이 필요하시면 언제든 문의해 주세요.

lch9502님의 프로필 이미지

작성한 질문수

질문하기