GNT sans publicité, site mobile, fonctionnalitées exclusives...

[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 ?
Lire les 15 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles
Le #18978001
Il se trouve que patrice a formulé :
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.



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)
patrice
Le #18979041
"Gilles" news:
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)
Gilles
Le #18979241
patrice vient de nous annoncer :
"Gilles" news:
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.
Daniel
Le #18979571
patrice a écrit :
"Gilles" news:
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)





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
;-)
patrice
Le #18979561
Merci 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$
patrice a écrit :
> "Gilles" > news:
>> 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)
>
>

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
;-)


Publicité
Suivre les réponses
Poster une réponse
Anonyme