Transactions et verrouillage

Bonjour à tous,
Je cherche à verrouiller une table en lecture et en écriture à la fois,
est-ce qu’un MonModel.transaction do … est suffisant ?
Mon code ressemble à ceci :

si MonModel.find … = 0
alors j’insère
sinon j’update

Et je souhaite encadrer ceci en verrouillant les données pour éviter
qu’une
insertion ait lieu entre le find et l’insert.

Merci de votre aide
Emilien

Emilien T. wrote:

Bonjour à tous,
Je cherche à verrouiller une table en lecture et en écriture à la
fois, est-ce qu’un MonModel.transaction do … est suffisant ?
Définitivement ?
Mon code ressemble à ceci :

si MonModel.find … = 0
alors j’insère
sinon j’update
Comment insérer et updater si la table est verrouillé ?

Sinon regarde peut-être du coté du Locking Active Record :

http://api.rubyonrails.com/classes/ActiveRecord/Locking/Optimistic.html

Sinon je t’envoi sur une discussion très récente à ce sujet sur cette
même liste.

http://groups.google.com/group/railsfrance/browse_thread/thread/f270e75d19feec4b#


Cyril M.

Effectivement j’avais vu passer cette discussion, mais ce n’est pas tout
Ã
fait la même problématique : mon soucis est d’avoir deux insertions
concurrentes ce qui casse la pkey (logique).
Le locking ActiveRecord semble également lié à la mise à jour d’un
enregistrement.

Le fonctionnel sous-jacent et de calculer des stats de visualisation
d’annonce (une insertion par IP, par annonce et par jour) donc pas
évident
de générer toutes les insertions en amont…

Merci pour ta réponse.

2009/2/11 Cyril M. [email protected]

mon soucis est d’avoir deux insertions concurrentes ce qui casse la pkey
(logique).

tu as peur que 2 insertions concurrentes te créent 2 entrées avec la
meme
clé primaire ? si c’est ça, t’inquiètes pas, ça ne peut pas arriver (-:

gUI


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/

Oui évidemment :slight_smile: mais ça lance une exception. J’en suis d’ailleurs
arrivé Ã
la conclusion que la solution la plus simple est de faire un rescue sur
l’exception et de passer mon chemin. C’est un cas de figure très rare où
un
visiteur regarde la même annonce deux fois assez proche pour que ça
passe
sur deux instance différentes de mongrel qui se collisionnent sur
l’insertion.

2009/2/11 Guillaume B. [email protected]

une exception ? je ne pense meme pas : c’est géré au niveau du SGBD,
c’est
d’ailleurs principalement à ça que ça sert. Ruby n’y vera jamais rien.

gUI

Le 11 février 2009 12:04, Emilien T. [email protected] a écrit :

Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/

Précisément : ActiveRecord::StatementInvalid “Mysql::Error: Duplicate
entry…”

2009/2/11 Guillaume B. [email protected]

alors j’ai pas compris de quoi il s’agit…

gUI

Le 11 février 2009 12:44, Emilien T. [email protected] a écrit :

2009/2/11 Guillaume B. [email protected]


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/