사용자 정의 필드 동시성 문제

커스텀 필드에서 동시성 문제를 겪는 경우가 있습니다.

예를 들어, 웹훅 핸들러가 다음과 같이 동작한다고 가정해 보겠습니다.

user_id = params[:externalUserId].split('-')[1]
user = User.find_by(id: user_id)
raise Discourse::NotFound unless user

... 많은 처리를 수행 ...

user.custom_fields[:myfield] = params[:whatever]
user.save_custom_fields

동일한 사용자를 대상으로 두 개의 웹훅이 짧은 시간 간격으로 연속으로 트리거되면, 때때로 중복된 행이 생성됩니다. 다음에 사용자 커스텀 필드에 접근하면 다음과 같은 형태가 됩니다.
{"myfield"=>["value", "value"]}

user_custom_fields 테이블에서 (user_id, name)이 인덱스로 정의되어 있지만 유니크 제약이 없음을 확인했습니다.

이 문제를 방지하기 위한 가장 좋은 패턴은 무엇일까요?

4개의 좋아요