Custom_fields mis à jour simultanément la cause de la valeur pour la transformer en tableau

Ce bug semble avoir été corrigé il y a un certain temps, comme indiqué dans ce post : Custom_fields simultaneous save with json becomes an array

Malheureusement, je dois maintenant gérer des appels simultanés à des points de terminaison qui mettent à jour les custom_fields de l’utilisateur en même temps, ce qui fait que les valeurs que j’ai définies comme :text se transforment en tableaux.

3 points de terminaison appelés et définissant custom_field en tableau au lieu d'une chaîne

Une aide serait la bienvenue. Cela bloque actuellement l’ensemble de mon projet…

Je rencontre ce problème sur la version 2.5.0.beta7 en développement local.

Existe-t-il un moyen de verrouiller la base de données jusqu’à ce que les valeurs soient enregistrées dans cette situation ?

1 « J'aime »

Cela pourrait-il être le problème auquel je suis confronté ? Differences between transactions and locking - makandra dev

Notez que lorsque deux transactions s’exécutent simultanément dans deux threads, chaque thread ne voit pas les modifications de l’autre transaction tant qu’elles n’ont pas été validées avec succès. Il voit cependant ses propres modifications (c’est une explication simplifiée, la réalité est beaucoup plus complexe).

1 « J'aime »

def self.cast_custom_field(key, value, types, return_array = true)

Affiche des valeurs normales, ce qui me fait penser que plusieurs lignes ont été créées.

2 « J'aime »

Cela aurait dû régler le problème. C’était un bug de longue date.

2 « J'aime »

Oui, je l’ai vu :frowning:

Malheureusement, je me trouve maintenant confronté à la mise à jour de données sensibles potentiellement en même temps. Je pense que cela se produit parce que je le fais via des points de terminaison, mais c’est la seule façon dont je peux le faire et je n’ai pas le contrôle sur les appels. Cela peut être un appel, cela peut être dix.

Je peux essayer de minimiser les appels depuis l’application et envoyer en bloc certaines données, le problème est qu’il y a deux sources pour les appels : mobile et services externes.

Des données de paiement sont impliquées :frowning:

1 « J'aime »

Cela ressemble au comportement existant des champs personnalisés et non à une régression. Il existe plusieurs façons de le corriger :

  1. Vous pouvez ajouter un index unique sur le champ personnalisé (nom, user_id).
  2. Vous pouvez entourer votre code d’un DistributedMutex.
  3. Vous pouvez utiliser une conception de table plutôt que des champs personnalisés.
3 « J'aime »

Quelque chose comme ça ? Ça semble fonctionner.

DistributedMutex.synchronize("user_data_update_#{user.id}") do
    user.save_custom_fields(true)
end
1 « J'aime »

En plus de cela, je vais modifier la logique pour exécuter les appels un par un plutôt que tous en même temps, ce qui devrait prévenir tout problème.

Merci les gars @eviltrout @fzngagan

4 « J'aime »