Bonjour
Dans une appli que je reprends, j'ai quelques portions de code de ce type
Identifiant = DMax("[Champs]","Table","Condition") + 1
Je m'interroge sur le comportement de DMax en environnement
multi-utilisateur.
N'y a-t-il pas le risque que 2 utilisateurs obtiennent le même identifiant
?
Si oui, comment protéger cette section de code ou comment la modifier ?
Merci d'avance
Didier
Bonjour
Dans une appli que je reprends, j'ai quelques portions de code de ce type
Identifiant = DMax("[Champs]","Table","Condition") + 1
Je m'interroge sur le comportement de DMax en environnement
multi-utilisateur.
N'y a-t-il pas le risque que 2 utilisateurs obtiennent le même identifiant
?
Si oui, comment protéger cette section de code ou comment la modifier ?
Merci d'avance
Didier
Bonjour
Dans une appli que je reprends, j'ai quelques portions de code de ce type
Identifiant = DMax("[Champs]","Table","Condition") + 1
Je m'interroge sur le comportement de DMax en environnement
multi-utilisateur.
N'y a-t-il pas le risque que 2 utilisateurs obtiennent le même identifiant
?
Si oui, comment protéger cette section de code ou comment la modifier ?
Merci d'avance
Didier
Bonjour
Dans une appli que je reprends, j'ai quelques portions de code de ce type
Identifiant = DMax("[Champs]","Table","Condition") + 1
Je m'interroge sur le comportement de DMax en environnement
multi-utilisateur.
N'y a-t-il pas le risque que 2 utilisateurs obtiennent le même identifiant
?
Si oui, comment protéger cette section de code ou comment la modifier ?
Merci d'avance
Didier
Bonjour
Dans une appli que je reprends, j'ai quelques portions de code de ce type
Identifiant = DMax("[Champs]","Table","Condition") + 1
Je m'interroge sur le comportement de DMax en environnement
multi-utilisateur.
N'y a-t-il pas le risque que 2 utilisateurs obtiennent le même identifiant
?
Si oui, comment protéger cette section de code ou comment la modifier ?
Merci d'avance
Didier
Bonjour
Dans une appli que je reprends, j'ai quelques portions de code de ce type
Identifiant = DMax("[Champs]","Table","Condition") + 1
Je m'interroge sur le comportement de DMax en environnement
multi-utilisateur.
N'y a-t-il pas le risque que 2 utilisateurs obtiennent le même identifiant
?
Si oui, comment protéger cette section de code ou comment la modifier ?
Merci d'avance
Didier
Bonjour Didier!
Voila un de mes dadas... Depuis toujours je prone l'utilisation des
NumeroAuto qui se comportent tres bien, justement pour pallier aux problemes
pour les applications en environement multi-utilisateurs.
En effet, dans la fonction tres simple que vous montrez, il n'y a rien qui
empeche plusieurs utilisateurs d'utiliser cette fonction au meme moment * et
d'obtenir le meme resultat. Tous ces utilisateurs vont donc essayer de creer
des enregistrements avec le meme identifiant.
La seule facon de remedier a cela est de serialiser la creation de
l'identifiant, pour qu'un seul utilisateur ne puisse creer qu'un seul
identifiant a la fois.
En general, cela passe par un enregistrement unique dans une table consacree
a cette fonction. Le candidat a un nouvel identifiant essaie de verrouiller
(en lecture-ecriture) l'enregistrement qui a la derniere valeur. Si le
verrouillage ne succede pas, on attend un certain temps, et on re-essaie.
Quand il finit par succeder, on determine la prochaine valeur, on cree ce
qui est necessaire (le minimum) de l'enregistrement voulu, on met a jour la
valeur, on leve le verrou, et on finit le boulot (s'il y avait des choses
autres que le minimum) sur l'enregistrement.
Il peut etre desirable d'enclore toute cette procedure dans une transaction
(tout du moins la partie "centrale", celle qui creee le nouvel identifiant
et le nouvel enregistrement).
Le but du jeux est de reduire le temps passe a "mettre en place le verrou -
creer le nouvel identifiant - creer le nouvel enregistrement - lever le
verrou", puisqu'il y a des chances qu'un autre utilisateur attende pour
faire la meme chose.
J'ai lance (et relance) un defi il y a pas mal de temps, en fait presque a
chaque fois que quelqu'un donne un fonction du meme type que ci-dessous
comme "solution efficace pour le remplacement des Numeros Auto". Le defi est
de mettre ici le code d'une fonction qui soit simple et elegante pour faire
le meme boulot, et qui fonctionne correctement en mode multi-utilisateurs.
Jusqu'a present, personne n'a encore releve le defi. Peut-etre est-ce
l'absence de recompense qui rends les candidats timides ;-)
Je sais que c'est possible de le faire, puisque j'ai eu a le faire dans un
projet il y a quelque temps. Mais a mon avis, ce n'est pas des plus simples,
et c'est surtout beaucoup plus difficile que de gerer les problemes de
"trous" qui sont la raison principale qui fait que les programmeurs en herbe
evitent les numeros auto.
* Quand je dis "en meme temps", c'est en fait deux temps dont la difference
n'est pas significative a l'echelle de l'operation en cours. Cela pourrait
etre quelques micro ou millisecondes pour une fonction rapide, mais peut
s'etendre jusqu'a plusieurs minutes (voire meme heures) lorsqu'il y a des
interventions humaines dans le flot de calcul.
J'espere que ca vous aide quelque peu dans votre reflexion...
Bonjour Daniel
Bonjour Didier!
Voila un de mes dadas... Depuis toujours je prone l'utilisation des
NumeroAuto qui se comportent tres bien, justement pour pallier aux problemes
pour les applications en environement multi-utilisateurs.
En effet, dans la fonction tres simple que vous montrez, il n'y a rien qui
empeche plusieurs utilisateurs d'utiliser cette fonction au meme moment * et
d'obtenir le meme resultat. Tous ces utilisateurs vont donc essayer de creer
des enregistrements avec le meme identifiant.
La seule facon de remedier a cela est de serialiser la creation de
l'identifiant, pour qu'un seul utilisateur ne puisse creer qu'un seul
identifiant a la fois.
En general, cela passe par un enregistrement unique dans une table consacree
a cette fonction. Le candidat a un nouvel identifiant essaie de verrouiller
(en lecture-ecriture) l'enregistrement qui a la derniere valeur. Si le
verrouillage ne succede pas, on attend un certain temps, et on re-essaie.
Quand il finit par succeder, on determine la prochaine valeur, on cree ce
qui est necessaire (le minimum) de l'enregistrement voulu, on met a jour la
valeur, on leve le verrou, et on finit le boulot (s'il y avait des choses
autres que le minimum) sur l'enregistrement.
Il peut etre desirable d'enclore toute cette procedure dans une transaction
(tout du moins la partie "centrale", celle qui creee le nouvel identifiant
et le nouvel enregistrement).
Le but du jeux est de reduire le temps passe a "mettre en place le verrou -
creer le nouvel identifiant - creer le nouvel enregistrement - lever le
verrou", puisqu'il y a des chances qu'un autre utilisateur attende pour
faire la meme chose.
J'ai lance (et relance) un defi il y a pas mal de temps, en fait presque a
chaque fois que quelqu'un donne un fonction du meme type que ci-dessous
comme "solution efficace pour le remplacement des Numeros Auto". Le defi est
de mettre ici le code d'une fonction qui soit simple et elegante pour faire
le meme boulot, et qui fonctionne correctement en mode multi-utilisateurs.
Jusqu'a present, personne n'a encore releve le defi. Peut-etre est-ce
l'absence de recompense qui rends les candidats timides ;-)
Je sais que c'est possible de le faire, puisque j'ai eu a le faire dans un
projet il y a quelque temps. Mais a mon avis, ce n'est pas des plus simples,
et c'est surtout beaucoup plus difficile que de gerer les problemes de
"trous" qui sont la raison principale qui fait que les programmeurs en herbe
evitent les numeros auto.
* Quand je dis "en meme temps", c'est en fait deux temps dont la difference
n'est pas significative a l'echelle de l'operation en cours. Cela pourrait
etre quelques micro ou millisecondes pour une fonction rapide, mais peut
s'etendre jusqu'a plusieurs minutes (voire meme heures) lorsqu'il y a des
interventions humaines dans le flot de calcul.
J'espere que ca vous aide quelque peu dans votre reflexion...
Bonjour Daniel
Bonjour Didier!
Voila un de mes dadas... Depuis toujours je prone l'utilisation des
NumeroAuto qui se comportent tres bien, justement pour pallier aux problemes
pour les applications en environement multi-utilisateurs.
En effet, dans la fonction tres simple que vous montrez, il n'y a rien qui
empeche plusieurs utilisateurs d'utiliser cette fonction au meme moment * et
d'obtenir le meme resultat. Tous ces utilisateurs vont donc essayer de creer
des enregistrements avec le meme identifiant.
La seule facon de remedier a cela est de serialiser la creation de
l'identifiant, pour qu'un seul utilisateur ne puisse creer qu'un seul
identifiant a la fois.
En general, cela passe par un enregistrement unique dans une table consacree
a cette fonction. Le candidat a un nouvel identifiant essaie de verrouiller
(en lecture-ecriture) l'enregistrement qui a la derniere valeur. Si le
verrouillage ne succede pas, on attend un certain temps, et on re-essaie.
Quand il finit par succeder, on determine la prochaine valeur, on cree ce
qui est necessaire (le minimum) de l'enregistrement voulu, on met a jour la
valeur, on leve le verrou, et on finit le boulot (s'il y avait des choses
autres que le minimum) sur l'enregistrement.
Il peut etre desirable d'enclore toute cette procedure dans une transaction
(tout du moins la partie "centrale", celle qui creee le nouvel identifiant
et le nouvel enregistrement).
Le but du jeux est de reduire le temps passe a "mettre en place le verrou -
creer le nouvel identifiant - creer le nouvel enregistrement - lever le
verrou", puisqu'il y a des chances qu'un autre utilisateur attende pour
faire la meme chose.
J'ai lance (et relance) un defi il y a pas mal de temps, en fait presque a
chaque fois que quelqu'un donne un fonction du meme type que ci-dessous
comme "solution efficace pour le remplacement des Numeros Auto". Le defi est
de mettre ici le code d'une fonction qui soit simple et elegante pour faire
le meme boulot, et qui fonctionne correctement en mode multi-utilisateurs.
Jusqu'a present, personne n'a encore releve le defi. Peut-etre est-ce
l'absence de recompense qui rends les candidats timides ;-)
Je sais que c'est possible de le faire, puisque j'ai eu a le faire dans un
projet il y a quelque temps. Mais a mon avis, ce n'est pas des plus simples,
et c'est surtout beaucoup plus difficile que de gerer les problemes de
"trous" qui sont la raison principale qui fait que les programmeurs en herbe
evitent les numeros auto.
* Quand je dis "en meme temps", c'est en fait deux temps dont la difference
n'est pas significative a l'echelle de l'operation en cours. Cela pourrait
etre quelques micro ou millisecondes pour une fonction rapide, mais peut
s'etendre jusqu'a plusieurs minutes (voire meme heures) lorsqu'il y a des
interventions humaines dans le flot de calcul.
J'espere que ca vous aide quelque peu dans votre reflexion...
Bonjour Daniel
N° d'ordre dans la période sur 5 caractères (de 00000 à 99999)
Je vais donc presumer que le quidam qui a emis l'idee de cette numerotation
Période sur 2 caractères (de 01 à 13)
Cela me rappelle un client qui voulait des mois ronds d'exactement 4
Bonjour Daniel
Pour être tout à fait exact, ce n'est qu'une partie du code.
Le numéro attribué est de la forme
Site sur 1 caractère (codifié de 1 à 9)
Exercice sur 2 caractères (de 00 à 99), je verrais en 2099 pour modifier
Période sur 2 caractères (de 01 à 13)
N° d'ordre dans la période sur 5 caractères (de 00000 à 99999)
le DMax ne sert qu'à attribuer le N° suivant dans la période sinon on
recommence à 1
Tout celà pour dire que le numéroauto est inutilisable dans ce cas
malgrè ses avantages indéniables.
Alors que faire
Une table Compteur avec un accès exclusif ?
Utilisé un sémaphore système (pour les courageux)?
N° d'ordre dans la période sur 5 caractères (de 00000 à 99999)
Je vais donc presumer que le quidam qui a emis l'idee de cette numerotation
Période sur 2 caractères (de 01 à 13)
Cela me rappelle un client qui voulait des mois ronds d'exactement 4
Bonjour Daniel
Pour être tout à fait exact, ce n'est qu'une partie du code.
Le numéro attribué est de la forme
Site sur 1 caractère (codifié de 1 à 9)
Exercice sur 2 caractères (de 00 à 99), je verrais en 2099 pour modifier
Période sur 2 caractères (de 01 à 13)
N° d'ordre dans la période sur 5 caractères (de 00000 à 99999)
le DMax ne sert qu'à attribuer le N° suivant dans la période sinon on
recommence à 1
Tout celà pour dire que le numéroauto est inutilisable dans ce cas
malgrè ses avantages indéniables.
Alors que faire
Une table Compteur avec un accès exclusif ?
Utilisé un sémaphore système (pour les courageux)?
N° d'ordre dans la période sur 5 caractères (de 00000 à 99999)
Je vais donc presumer que le quidam qui a emis l'idee de cette numerotation
Période sur 2 caractères (de 01 à 13)
Cela me rappelle un client qui voulait des mois ronds d'exactement 4
Bonjour Daniel
Pour être tout à fait exact, ce n'est qu'une partie du code.
Le numéro attribué est de la forme
Site sur 1 caractère (codifié de 1 à 9)
Exercice sur 2 caractères (de 00 à 99), je verrais en 2099 pour modifier
Période sur 2 caractères (de 01 à 13)
N° d'ordre dans la période sur 5 caractères (de 00000 à 99999)
le DMax ne sert qu'à attribuer le N° suivant dans la période sinon on
recommence à 1
Tout celà pour dire que le numéroauto est inutilisable dans ce cas
malgrè ses avantages indéniables.
Alors que faire
Une table Compteur avec un accès exclusif ?
Utilisé un sémaphore système (pour les courageux)?