有时我们会遇到自定义字段的并发问题。
例如,一个 webhook 处理程序会执行以下操作:
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
当两个 webhook 针对同一用户快速连续触发时,有时我们会得到一个重复的行。下次访问用户自定义字段时,它们看起来像:
{"myfield"=>["value", "value"]}
我看到 (user_id, name) 在 user_custom_fields 上被定义为一个索引,但不是唯一的。
有什么最佳模式可以防止这种情况发生?