Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[bruit] vous verriez quoi pour gerer le blocage des enrg sous mysql ?

7 réponses
Avatar
mystere689
J'utilise la classe c_mySQL4WD dans un projet WINDEV interfacer avec
une base de donn=E9e Mysql V4.

Lorsque l'on bloque un enrg, l'utilisateur suivant se trouve bloquer
sans message ni rien devant son ecran en attendant soit la mise =E0
dispo de l'enrg soit un message de mysql comme quoi l'enrg est bloqu=E9.
Comme dans mysql, on ne peut pas tester si l'enrg est bloqu=E9, il a
deja =E9t=E9 sugg=E9r=E9 ici de g=E9rer le probl=E8me soi meme avec des fla=
g qui
permette de savoir si ce dernier est lock=E9.

Ma question =E9t=E9 la suivante. Faut-il g=E9rer le flag dans l'enrg lui
m=EAme (genre un champ lock =E0 O ou N) ou pr=E9voir un fichier LOCK g=E9n=
=E9ral
qui contiendra les enrg ock pour l'ensemble de la base ou encore (cela
me parait plus ad=E9quate) de cr=E9e un fichier LOCK par fichier DATA est
les li=E9e par une liaison 1:1.

Ce qui m'interpelle dans cette fa=E7on de faire, c'est que l'on va avoir
aussi un probl=E8me d'acc=E8s concurrence quand on va verrouill=E9 les enrg
qui servent =E0 stock les infos de verrouillage (on suit toujours
l=E0????).

En r=E9sum=E9, quel est votre d=E9marche pour g=E9rer l'acc=E8s concurrenti=
el et
=E9viter =E0 l'utilisateur d'attentre 5 minute devant son ecran vide.

7 réponses

Avatar
Gilles
mystere689 a exposé le 20/03/2009 :
En résumé, quel est votre démarche pour gérer l'accès concurrentiel et
éviter à l'utilisateur d'attentre 5 minute devant son ecran vide.



La règle la plus simple, c'est le dernier qui appuie sur enregistrer
qui a raison.

Faire des locks c'est ouvrir la porte aux ennuis en tous genres.

Une table de lock (surtout pas m'amuser à modifier le modèle).
(avec nom de la table, timestamp

Quand tu ouvres ta fiche qui doit locker, tu ajoutes un enregistrement
dans la table des locks, avec un timestamp.

Et tu accordes en délai raisonnable d'expiration en cas de plantage.
(un peu comme une session web). (genre 20 minutes)

Si le gars qui a locké n'a toujours pas enregistré 20 minutes plus tard
(création d'un petit timer via une procédure globale), on supprimer la
possibilité d'enregistrer, supprimer le lock et on fait apparaitre un
bouton pour relocker qui n'acceptera de le faire que si personne
d'autre n'a pris le jeton.

A l'ouverture de fenêtre, tu vérifies ton jeton dans la table des
locks, et tu acceptes de continuer le traitement ou tu n'ouvres la
fiche qu'en lecture seule. (Si l'enregistrement n'est pas trouvé ou le
jeton expiré, on lock)

Voilà comment je ferais si c'était vraiment primordial.

Gilles.
Avatar
Firetox
Bonjour,

sur un select ... for update en innodb dans une transaction mySQL renvoie au
bout d'un certain temps que la ligne est bloquée. ce temps est parametrable
sur le serveur (en general je met 10 seconde) au bout de ce temps j'ai bien
le message que la migne est boquée (par defaut mySQL a un time out de 60
seconde)

donc je gere les blocage normalement
un select for update et attente du resultat si le lock se fait la requete
renvoie vrai sinon faux et le message ligne bloquée

pour gerer un flag il faut bien penser aussi au deconnexion et shoot du prog
qui laisserait la ligne bloquée alors qu'elle ne l'est plus : bref tres
chaud a gerer

Bon dev
@+


"mystere689" a écrit dans le message de
news:
J'utilise la classe c_mySQL4WD dans un projet WINDEV interfacer avec
une base de donnée Mysql V4.

Lorsque l'on bloque un enrg, l'utilisateur suivant se trouve bloquer
sans message ni rien devant son ecran en attendant soit la mise à
dispo de l'enrg soit un message de mysql comme quoi l'enrg est bloqué.
Comme dans mysql, on ne peut pas tester si l'enrg est bloqué, il a
deja été suggéré ici de gérer le problème soi meme avec des flag qui
permette de savoir si ce dernier est locké.

Ma question été la suivante. Faut-il gérer le flag dans l'enrg lui
même (genre un champ lock à O ou N) ou prévoir un fichier LOCK général
qui contiendra les enrg ock pour l'ensemble de la base ou encore (cela
me parait plus adéquate) de crée un fichier LOCK par fichier DATA est
les liée par une liaison 1:1.

Ce qui m'interpelle dans cette façon de faire, c'est que l'on va avoir
aussi un problème d'accès concurrence quand on va verrouillé les enrg
qui servent à stock les infos de verrouillage (on suit toujours
là????).

En résumé, quel est votre démarche pour gérer l'accès concurrentiel et
éviter à l'utilisateur d'attentre 5 minute devant son ecran vide.
Avatar
Daniel
mystere689 a écrit :
J'utilise la classe c_mySQL4WD dans un projet WINDEV interfacer avec
une base de donnée Mysql V4.

Lorsque l'on bloque un enrg, l'utilisateur suivant se trouve bloquer
sans message ni rien devant son ecran en attendant soit la mise à
dispo de l'enrg soit un message de mysql comme quoi l'enrg est bloqué.
Comme dans mysql, on ne peut pas tester si l'enrg est bloqué, il a
deja été suggéré ici de gérer le problème soi meme avec des flag qui
permette de savoir si ce dernier est locké.

Ma question été la suivante. Faut-il gérer le flag dans l'enrg lui
même (genre un champ lock à O ou N) ou prévoir un fichier LOCK général
qui contiendra les enrg ock pour l'ensemble de la base ou encore (cela
me parait plus adéquate) de crée un fichier LOCK par fichier DATA est
les liée par une liaison 1:1.

Ce qui m'interpelle dans cette façon de faire, c'est que l'on va avoir
aussi un problème d'accès concurrence quand on va verrouillé les enrg
qui servent à stock les infos de verrouillage (on suit toujours
là????).

En résumé, quel est votre démarche pour gérer l'accès concurrentiel et
éviter à l'utilisateur d'attentre 5 minute devant son ecran vide.



Les commandes de "lock" sur mysql étant au strict minimum, le plus
simple est de faire une table qui indique l'enregistrement bloqué.

--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Avatar
Roumégou Eric
Daniel avait prétendu :
mystere689 a écrit :
J'utilise la classe c_mySQL4WD dans un projet WINDEV interfacer avec
une base de donnée Mysql V4.

Lorsque l'on bloque un enrg, l'utilisateur suivant se trouve bloquer
sans message ni rien devant son ecran en attendant soit la mise à
dispo de l'enrg soit un message de mysql comme quoi l'enrg est bloqué.
Comme dans mysql, on ne peut pas tester si l'enrg est bloqué, il a
deja été suggéré ici de gérer le problème soi meme avec des flag qui
permette de savoir si ce dernier est locké.

Ma question été la suivante. Faut-il gérer le flag dans l'enrg lui
même (genre un champ lock à O ou N) ou prévoir un fichier LOCK général
qui contiendra les enrg ock pour l'ensemble de la base ou encore (cela
me parait plus adéquate) de crée un fichier LOCK par fichier DATA est
les liée par une liaison 1:1.

Ce qui m'interpelle dans cette façon de faire, c'est que l'on va avoir
aussi un problème d'accès concurrence quand on va verrouillé les enrg
qui servent à stock les infos de verrouillage (on suit toujours
là????).

En résumé, quel est votre démarche pour gérer l'accès concurrentiel et
éviter à l'utilisateur d'attentre 5 minute devant son ecran vide.



Les commandes de "lock" sur mysql étant au strict minimum, le plus simple est
de faire une table qui indique l'enregistrement bloqué.



d'accord avec tout ce qui a été dit.
Pour ma part j'ai viré tous les locks de mon appli (lock innodb) car ce
temps d'attente mème réglable, c'est pas la panacée. En SqlServeur,
j'utilisais une table.
Mais j'ai tout viré.
1 - parce que vraiment l'utilité était discutable.
2 - trop chiant pour les utilisateurs

3 - et c'est pour ça que j'étais en innodb que je remplace maintenant
quand j'ai le temps par du myISAM (parce que c'est plus rapide pour les
bases surtout en interrogation et surtout parce qu'il y a le full text)

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Patrick Girard
Bonjour,

une petite précision, attention aux blocages 'mortels' dans le cas de
blocage de 2 tables :

exemple :
- un Process 'A' doit bloquer les tables 1 et 2
- un Process 'B' doit bloquer les tables 2 et 1

cas de blocage mortel :
A bloque la table 1
B bloque la table 2
A attends pour bloquer la table 2 et B attend pour bloquer la table1 -> tout
le monde est bloqué !

solution, dans le cas ou on doit bloquer plusieurs tables, toujours les
bloquer dans le meme ordre (alphabetique par ex.)
je ne sais pas si j'ai été assez clair.....


"Roumégou Eric" a écrit dans le message de news:

Daniel avait prétendu :
mystere689 a écrit :
J'utilise la classe c_mySQL4WD dans un projet WINDEV interfacer avec
une base de donnée Mysql V4.

Lorsque l'on bloque un enrg, l'utilisateur suivant se trouve bloquer
sans message ni rien devant son ecran en attendant soit la mise à
dispo de l'enrg soit un message de mysql comme quoi l'enrg est bloqué.
Comme dans mysql, on ne peut pas tester si l'enrg est bloqué, il a
deja été suggéré ici de gérer le problème soi meme avec des flag qui
permette de savoir si ce dernier est locké.

Ma question été la suivante. Faut-il gérer le flag dans l'enrg lui
même (genre un champ lock à O ou N) ou prévoir un fichier LOCK général
qui contiendra les enrg ock pour l'ensemble de la base ou encore (cela
me parait plus adéquate) de crée un fichier LOCK par fichier DATA est
les liée par une liaison 1:1.

Ce qui m'interpelle dans cette façon de faire, c'est que l'on va avoir
aussi un problème d'accès concurrence quand on va verrouillé les enrg
qui servent à stock les infos de verrouillage (on suit toujours
là????).

En résumé, quel est votre démarche pour gérer l'accès concurrentiel et
éviter à l'utilisateur d'attentre 5 minute devant son ecran vide.



Les commandes de "lock" sur mysql étant au strict minimum, le plus simple
est de faire une table qui indique l'enregistrement bloqué.



d'accord avec tout ce qui a été dit.
Pour ma part j'ai viré tous les locks de mon appli (lock innodb) car ce
temps d'attente mème réglable, c'est pas la panacée. En SqlServeur,
j'utilisais une table.
Mais j'ai tout viré.
1 - parce que vraiment l'utilité était discutable.
2 - trop chiant pour les utilisateurs

3 - et c'est pour ça que j'étais en innodb que je remplace maintenant
quand j'ai le temps par du myISAM (parce que c'est plus rapide pour les
bases surtout en interrogation et surtout parce qu'il y a le full text)

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)




Avatar
Daniel
Roumégou Eric a écrit :
Daniel avait prétendu :
mystere689 a écrit :
J'utilise la classe c_mySQL4WD dans un projet WINDEV interfacer avec
une base de donnée Mysql V4.

Lorsque l'on bloque un enrg, l'utilisateur suivant se trouve bloquer
sans message ni rien devant son ecran en attendant soit la mise à
dispo de l'enrg soit un message de mysql comme quoi l'enrg est bloqué.
Comme dans mysql, on ne peut pas tester si l'enrg est bloqué, il a
deja été suggéré ici de gérer le problème soi meme avec des flag qui
permette de savoir si ce dernier est locké.

Ma question été la suivante. Faut-il gérer le flag dans l'enrg lui
même (genre un champ lock à O ou N) ou prévoir un fichier LOCK général
qui contiendra les enrg ock pour l'ensemble de la base ou encore (cela
me parait plus adéquate) de crée un fichier LOCK par fichier DATA est
les liée par une liaison 1:1.

Ce qui m'interpelle dans cette façon de faire, c'est que l'on va avoir
aussi un problème d'accès concurrence quand on va verrouillé les enrg
qui servent à stock les infos de verrouillage (on suit toujours
là????).

En résumé, quel est votre démarche pour gérer l'accès concurrentiel et
éviter à l'utilisateur d'attentre 5 minute devant son ecran vide.



Les commandes de "lock" sur mysql étant au strict minimum, le plus
simple est de faire une table qui indique l'enregistrement bloqué.



d'accord avec tout ce qui a été dit.
Pour ma part j'ai viré tous les locks de mon appli (lock innodb) car ce
temps d'attente mème réglable, c'est pas la panacée. En SqlServeur,
j'utilisais une table.
Mais j'ai tout viré.
1 - parce que vraiment l'utilité était discutable.
2 - trop chiant pour les utilisateurs

3 - et c'est pour ça que j'étais en innodb que je remplace maintenant
quand j'ai le temps par du myISAM (parce que c'est plus rapide pour les
bases surtout en interrogation et surtout parce qu'il y a le full text)



Une petite astuce concernant InnoDB pour améliorer les performances dans
le cas de volumétrie importante.

Ne jamais faire de count(*), mais faire une table de count qui se
remplit avec un trigger, et ensuite on lit le count dans cette table.

Toujours mettre un PK de type entier.

--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Avatar
mystere689
On 20 mar, 00:18, Daniel wrote:
Roumégou Eric a écrit :

> Daniel avait prétendu :
>> mystere689 a écrit :
>>> J'utilise la classe c_mySQL4WD dans un projet WINDEV interfacer avec
>>> une base de donnée Mysql V4.

>>> Lorsque l'on bloque un enrg, l'utilisateur suivant se trouve bloquer
>>> sans message ni rien devant son ecran en attendant soit la mise à
>>> dispo de l'enrg soit un message de mysql comme quoi l'enrg est bloqu é.
>>> Comme dans mysql, on ne peut pas tester si l'enrg est bloqué, il a
>>> deja été suggéré ici de gérer le problème soi meme avec d es flag qui
>>> permette de savoir si ce dernier est locké.

>>> Ma question été la suivante. Faut-il gérer le flag dans l'enrg lui
>>> même (genre un champ lock à O ou N) ou prévoir un fichier LOCK général
>>> qui contiendra les enrg ock pour l'ensemble de la base ou encore (cel a
>>> me parait plus adéquate) de crée un fichier LOCK par fichier DATA est
>>> les liée par une liaison 1:1.

>>> Ce qui m'interpelle dans cette façon de faire, c'est que l'on va av oir
>>> aussi un problème d'accès concurrence quand on va verrouillé le s enrg
>>> qui servent à stock les infos de verrouillage (on suit toujours
>>> là????).

>>> En résumé, quel est votre démarche pour gérer l'accès concu rrentiel et
>>> éviter à l'utilisateur d'attentre 5 minute devant son ecran vide.

>> Les commandes de "lock" sur mysql étant au strict minimum, le plus
>> simple est de faire une table qui indique l'enregistrement bloqué.

> d'accord avec tout ce qui a été dit.
> Pour ma part j'ai viré tous les locks de mon appli (lock innodb) car ce
> temps d'attente mème réglable, c'est pas la panacée. En SqlServeu r,
> j'utilisais une table.
> Mais j'ai tout viré.
> 1 - parce que vraiment l'utilité était discutable.
> 2 - trop chiant pour les utilisateurs

> 3 - et c'est pour ça que j'étais en innodb que je remplace maintena nt
> quand j'ai le temps par du myISAM (parce que c'est plus rapide pour les
> bases surtout en interrogation et surtout parce qu'il y a le full text)

Une petite astuce concernant InnoDB pour améliorer les performances dan s
le cas de volumétrie importante.

Ne jamais faire de count(*), mais faire une table de count qui se
remplit avec un trigger, et ensuite on lit le count dans cette table.

Toujours mettre un PK de type entier.

--
suivre ce lien pour répondre:http://cerbermail.com/?2KrV3YZXnn
Daniel
  ;-)



Merci à tous et que de matière à travailler.

Question :
1) le dernier a raison, là je pens epas sur une gestion de stock. Pour
mettre à jour, il faut bien que la 1er facture est les element de CUMP
par exemple, mettre à jour les info, et autorise la prochaine
transaction pour que la seconde facture puisse refair ele calcul (je
schématise rapidement le concept)
2) attention aux blocages 'mortels' : remarque très pertinente, et je
vous en remercie.
3) Ou règle-ton ce fameux temps d'attente (peut être que 10 seconde
reste supportable ???)
4) On me parle d'une table de LOCK, donc celle ci devant gérer toute
le blocage de toutes les tables devra contenir un champ du nom de la
table, et de la clé d'enrg ????
5) il faut bien penser aussi au deconnexion et shoot du prog : oui,
surtout que l'on va avoir des terminaux portable de saisie. Je pense
mettre en place une sorte de cash de requette sql.


Auriez vous des sites qui exposerait la mise en place ou des docs ???
Google ne m'a pas beaucoup aidé mais c'est surment que j ai du mal à
formuler m'a demande.

merci a tous de vos remarques. Mais le problème est loin d'etre
résolu, donc je vais me penché sur le sujet.