[HS] Equivalent des locks en sql
Le
patrice
Bonjour
Y'a eu un thread récent sur les locks de mysql.
D'apres ce que j'ai lu, il semblerait qu'il faille éviter de les utiliser.
Autant pour mettre a jour une fiche, "le dernier qui parle a raison" me
semble une bonne méthode.
Mais comment se gere par exemple la vente de produit en stock.
En hf (séquentiel indexé) standard, on ferait un truc du genre :
verouille(fiche_produit)
si qte_dispo>=quantité_demandé alors qte_dispo=qte_dispo -
quantité_demandé, enregistrer(fiche_produit)
sinon
deverouille(fiche_produit)
afficher "Cette quantité n'est pas disponible"
Cela permet d'etre sur de ne vendre que ce que l'on a.
Mais que devient cet algorithme en sql, mysql, mssql ? existe une facon
standard de procéder ?
Y'a eu un thread récent sur les locks de mysql.
D'apres ce que j'ai lu, il semblerait qu'il faille éviter de les utiliser.
Autant pour mettre a jour une fiche, "le dernier qui parle a raison" me
semble une bonne méthode.
Mais comment se gere par exemple la vente de produit en stock.
En hf (séquentiel indexé) standard, on ferait un truc du genre :
verouille(fiche_produit)
si qte_dispo>=quantité_demandé alors qte_dispo=qte_dispo -
quantité_demandé, enregistrer(fiche_produit)
sinon
deverouille(fiche_produit)
afficher "Cette quantité n'est pas disponible"
Cela permet d'etre sur de ne vendre que ce que l'on a.
Mais que devient cet algorithme en sql, mysql, mssql ? existe une facon
standard de procéder ?

Poser une question


Ca dépend de ce que tu as à vendre.
Mais le plus efficace reste de réserver l'item sélectionner et de le
considérer hors stock jusqu'à validation ou annulation de la commande.
avec bien sûr le cas à gérer du plantage. (il faut donc gérer ces
quantités réservées avec des timestamps)
Je vois pas comment effectuer cette réservation .
Si on vend des produits unitaires (une fiche par produit à vendre), il y
aurait un flag "reservé", mais comment garantir de ne positionner ce flag
que s'il n'est pas déjà positionné.
(2 personne liste la table, l'item n'est pas réservé, les 2 le réserve en
même temps)
Si on vend des produits en quantité (une fiche par produit, avec champ
quantité), comment soustraire une quantité que si la quantité est supérieure
à la quantité à soustraire (on parle bien sur de 2 personnes faisant la
requete en meme temps)
Tu fais une table de réservations (qui contient, id incrémental, id
produit, et quantité, et éventuellement dateheure pour les crashs)
quand tu ajoutes un produit en stock, tu ajoutes la ligne
correspondante et tu gardes l'id d'insertion en mémoire.
Quand tu valides, après le destockage réel, tu supprimes cette ligne.
tu ne peux jamais te retrouver en défaut, seulement en excès.
pour le cas peu probable où une autre lecture s'est faite entre ta
lecture et ton insert de réservation, tu revérifies les quantités en
stock et en réservation au moment de l'enregistrement réel de la
commande.
faire un select for update pour récupérer la valeur du stock et ensuite
un update, le tout dans une transaction.
--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
en regardant dans la doc le select for update je tombe sur :
Dans ce cas, il y a deux bonnes méthodes pour implémenter la lecture et
l'incrémentation du compteur : (1) modifiez le compteur d'une unité, et
lisez le après cela ou (2) lisez le compteur d'abord, avec un verrou en mode
FOR UPDATE, puis incrémentez le :
SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;
c'est exactement ca.merci
"Daniel" news:49ca678f$0$3511$
flag
en
supérieure