Skip to content

Commit 5d8a988

Browse files
committed
fix: tx없이 Lock획득 시도하는 버그를 수정한다
1 parent 23737b3 commit 5d8a988

2 files changed

Lines changed: 17 additions & 3 deletions

File tree

src/main/kotlin/org/gitanimals/quiz/domain/context/QuizSolveContextRepository.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,16 @@ interface QuizSolveContextRepository : JpaRepository<QuizSolveContext, Long> {
1313
solvedAt: LocalDate,
1414
): QuizSolveContext?
1515

16-
@Lock(LockModeType.PESSIMISTIC_WRITE)
1716
@Query("select q from QuizSolveContext q join fetch q.quizSolveContextQuiz where q.id = :id and q.userId = :userId")
1817
fun findByIdAndUserId(
1918
id: Long,
2019
userId: Long,
2120
): QuizSolveContext?
21+
22+
@Lock(LockModeType.PESSIMISTIC_WRITE)
23+
@Query("select q from QuizSolveContext q join fetch q.quizSolveContextQuiz where q.id = :id and q.userId = :userId")
24+
fun findByIdAndUserIdWithLock(
25+
id: Long,
26+
userId: Long,
27+
): QuizSolveContext?
2228
}

src/main/kotlin/org/gitanimals/quiz/domain/context/QuizSolveContextService.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,26 @@ class QuizSolveContextService(
4444

4545
@Transactional
4646
fun solveQuiz(id: Long, userId: Long, answer: String) {
47-
val quizSolveContext = getQuizSolveContextByIdAndUserId(id, userId)
47+
val quizSolveContext = getQuizSolveContextByIdAndUserIdWithLock(id, userId)
4848

4949
quizSolveContext.solve(answer)
5050
}
5151

5252
@Transactional
5353
fun stopQuizByIdAndUserId(id: Long, userId: Long) {
54-
val quizSolveContext = getQuizSolveContextByIdAndUserId(id, userId)
54+
val quizSolveContext = getQuizSolveContextByIdAndUserIdWithLock(id, userId)
5555

5656
quizSolveContext.stopSolve()
5757
}
5858

59+
private fun getQuizSolveContextByIdAndUserIdWithLock(
60+
id: Long,
61+
userId: Long
62+
): QuizSolveContext {
63+
return quizSolveContextRepository.findByIdAndUserIdWithLock(id, userId)
64+
?: throw IllegalArgumentException("Cannot find quizContext by id: \"$id\" and userId: \"$userId\"")
65+
}
66+
5967
fun getQuizSolveContextByIdAndUserId(
6068
id: Long,
6169
userId: Long

0 commit comments

Comments
 (0)