나는 GeneralKnowledgeTest 객체를 가지고 있으며 사용자가 그 테스트를 할 때마다 업데이트되는 많은 통계 필드 (ratingsCount, responsesCount, ratingStars ...)를 포함하고있다. takeTest() -> 트랜잭션 메소드).spring/jpa/hibernate에서 낙관적 잠금에 관한 간단한 디자인 질문
동시에 많은 사용자가 동일한 테스트를 수행 할 수 있으므로 낙관적 잠금 예외가 throw되는 경우 takeTest 메서드를 다시 시도하는 낙관적 잠금 (@version) 및 a 인터셉터를 구현할 생각이었습니다. .
따라서 takeTest 메서드 내에서 항상 새로운 GeneralKnowledgeTest 인스턴스를 얻습니다. entityManager.find (testId) 그런 다음 통계 필드를 업데이트하십시오. 낙관적 인 예외가 발생하는 경우 인터셉터는 성공할 때까지 단순히 takeTest 메서드를 다시 시도합니다.
이 절차에 대한 의견이 있으십니까? 동일한 테스트를 수행하려고하는 사용자가 많은 시스템에 대해 낙관적 잠금을 구현하는 좋은 방법입니까?
추신. 비즈니스는 낙관적 인 잠금 예외가 발생하면 경고 메시지를 표시하지 않습니다. 따라서 인터셉터는 원활한 실행을 위해 반드시 필요합니다 ...
많은 사용자가 동일한 시간에 테스트를 수행하고 완료 할 수 있습니다 (예 : 하루 테스트 등). 나는 낙관적 인 잠금 성능 측면에서 괜찮아요 읽어, 그래서 데이터베이스 잠금이 없습니다. (100 명의 사용자가 동일한 시간에 동일한 테스트를 수행/완료하고 takeTest가 트랜잭션을 조금 더 오래 걸리게하는 많은 추가 db 객체를 만드는 복잡한 메소드라고 생각해보십시오). 그러나 일반적으로 내가 제안한 approch에 문제가 있습니까? 오류나 불일치가 있습니까? 사전에 감사합니다 –
아니오, 오류가 없습니다. 낙관적 인 잠금 기능을 사용하지 않으면 데이터를 다시 읽게되지만 데이터베이스로드가 증가하고 테이크 테스트 로직을 다시 실행하면 CPU로드가 증가합니다. 이 접근법에는 아무런 문제가 없으며 잠금 실패 빈도에 따라 달라집니다. – Will