Skip to content

fix: PostgreSQL 업무 상세 조회의 잠금 충돌 수정 - #203

Merged
krestar merged 1 commit into
mainfrom
fix/task-detail-readonly-lock-conflict
Aug 17, 2026
Merged

fix: PostgreSQL 업무 상세 조회의 잠금 충돌 수정#203
krestar merged 1 commit into
mainfrom
fix/task-detail-readonly-lock-conflict

Conversation

@krestar

@krestar krestar commented Aug 17, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

PR #199 에서 근로자 보관과 신규 Task 생성이 동시에 진행될 때의 경합을 막기 위해
WorkerTaskContextReader.findByIdAndCompanyId()에 근로자 행 잠금(FOR UPDATE)이 추가됐습니다.

이 메서드는 Task 생성뿐 아니라 TaskWorkflowService.findById()의 업무 상세 조회에서도
공유되고 있습니다. 업무 상세 조회는 @Transactional(readOnly = true) 트랜잭션이므로,
PostgreSQL에서 근로자 대상 업무를 조회하면 다음 오류와 함께 500 응답이 발생합니다.

ERROR: cannot execute SELECT FOR UPDATE in a read-only transaction

근로자 보관과 Task 생성 사이의 직렬화는 유지하면서, 읽기 전용 업무 상세 조회에서는
행 잠금을 수행하지 않도록 조회 경로를 분리할 필요가 있습니다.

Related: #199

무엇이 바뀌나요?

  • WorkerTaskContextReader에 읽기 전용 근로자 컨텍스트 조회를 추가합니다.
  • JDBC 구현에서 근로자 컨텍스트 매핑 쿼리를 공통화하고, 읽기 전용 조회에서는
    FOR UPDATE를 실행하지 않습니다.
  • 업무 상세 조회는 읽기 전용 경로를 사용합니다.
  • Task 생성·수정 등 기존 변경 트랜잭션은 잠금 조회를 계속 사용하므로,
    PR #199에서 도입한 근로자 보관과 Task 생성 간 직렬화는 유지됩니다.
  • PostgreSQL 데모 시드 통합 테스트에서 대표 근로자 업무 상세를 실제로 조회하여
    읽기 전용 트랜잭션 회귀를 검증합니다.

잠금 범위

경로 근로자 행 잠금 이유
업무 상세 조회 사용하지 않음 읽기 전용 트랜잭션이며 상태 변경이 없음
Task 생성·변경 유지 보관과 업무 변경 사이의 경합 방지
근로자 보관 유지 보관 조건 확인과 보관 처리를 직렬화

검증

  • git diff --check
  • PostgreSQL 환경에서 DemoSeedPostgreSqlApplicationIntegrationTest 통과
  • GET /api/v1/tasks/94000000-0000-0000-0000-000000000003가 200 응답
  • WorkerArchiveIntegrationTest 통과
  • 잠금 적용 경로가 변경되지 않았음을 코드로 확인

영향 범위

  • DB 스키마 및 API 계약 변경은 없습니다.
  • 보관된 근로자를 신규 Task 대상에서 제외하는 기존 동작은 유지됩니다.
  • 기존 Task·문서·응답·감사 기록을 보존하는 PR #199의 정책은 변경하지 않습니다.

- 읽기 전용 업무 상세 조회에서 SELECT FOR UPDATE가 실행되어
PostgreSQL이 500 오류를 반환하던 문제를 수정한다.

- 업무 상세 조회에는 비잠금 근로자 조회를 사용하고,
Task 생성·변경 경로의 행 잠금은 유지하여 근로자 보관과의
동시성 제어가 계속 동작하도록 한다.

- PostgreSQL 데모 시드 테스트에 업무 상세 조회 회귀 검증을 추가한다.
@krestar
krestar marked this pull request as draft August 17, 2026 04:49
@krestar krestar self-assigned this Aug 17, 2026
@krestar
krestar marked this pull request as ready for review August 17, 2026 05:10
@krestar
krestar merged commit 4aff9db into main Aug 17, 2026
4 checks passed
@krestar
krestar deleted the fix/task-detail-readonly-lock-conflict branch August 17, 2026 05:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant