J'ai une certaine logique dans before_save
où (seulement) lorsque certaines conditions sont remplies, je laisse la nouvelle ligne être créée avec special_number
égal au nombre spécial maximum dans la base de données + 1. (Si les conditions ne sont pas remplies alors je fais quelque chose de différent, donc je ne peux pas utiliser les incréments automatiques)ActiveRecord et les transactions entre `before_save` et` save`
Mon souci est que deux threads agissant sur cette base de données à la fois puissent choisir le même special_number
si le second est exécuté pendant que le premier est l'épargne. Est-il possible de verrouiller la base de données entre before_save
et terminer la sauvegarde, mais seulement dans certains cas? Je sais que toutes les sauvegardes sont envoyées dans les transactions, cela fera-t-il le travail pour moi?
def before_save
if things_are_just_right
# -- Issue some kind of lock?
# -- self.lock? I have no idea
# Pick new special_number
new_special = self.class.maximum('special_number') + 1
write_attribute('special_number',new_special)
else
# No need to lock in this case
write_attribute('special_number',some_other_number)
end
end
Je suis pas réellement en utilisant MySQL! (heroku + sqlite3) - Je ne pense pas que sqlite a une fonction équivalente? –