1. #1
    Nouveau membre du Club
    Homme Profil pro
    amateur
    Inscrit en
    mars 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : mars 2014
    Messages : 28
    Points : 27
    Points
    27

    Par défaut Et si on clique en même temps ?

    Bonjour,

    Un collègue et moi devons gérer une base de donnée mysql pour la prise de rendez vous de plusieurs milliers d'utilisateurs.
    Par défaut nous créons une table avec tous les créneaux horaires ouvert par jour, vide et nous les remplissons avec les rendez vous pries.

    Afin que 2 utilisateurs ne puissent pas prendre le même rendez vous, dans le formulaire de prise de rendez vous, nous ne proposons que les rendez vous non pris.

    Toutefois, entre le moment ou l'utilisateur consulte les plages libres, choisit et valide, il peut se passer plusieurs secondes, voir minutes.
    Avant l'UPDATE de la table plageHoraire, nous prévoyons de vérifier une nouvelle fois si la plage horaire a été déjà enregistrée (rendez vous prit) en base.

    Comme il y a beaucoup d'utilisateur pour peu de plage horaire libre, nous craignons que 2 utilisateurs puissent toutefois valider à la milliseconde prêt.
    Est ce possible? que ce passerait il? comment l'éviter le cas échéant?

    merci par avance de votre retour d'expert

  2. #2
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 009
    Points : 39 476
    Points
    39 476
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par shoooryuken Voir le message
    Avant l'UPDATE de la table plageHoraire, nous prévoyons de vérifier une nouvelle fois si la plage horaire a été déjà enregistrée (rendez vous prit) en base.
    Cela ne sert absolument à rien ! Car dans la microseconde suivante les choses peuvent à nouveau changer !
    Comme il y a beaucoup d'utilisateur pour peu de plage horaire libre, nous craignons que 2 utilisateurs puissent toutefois valider à la milliseconde prêt.
    Est ce possible? que ce passerait il? comment l'éviter le cas échéant?
    En faisant la requête UPDATE appropriée et en testant correctement. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE MatableRV
    SET MonRv = 'le patient machin'
    WHERE créneau = 12456
       AND MonRV IS NULL; --> ceci empêche l'écrasement d'un créneau qui vient juste d'être pris !
    Dans votre application client, vous devez tester si 1 ligne a été mise à jour ou 0. Si 0 informer que le créneau a été pris entre temps et reproposer une nouvelle liste de créneaux....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  3. #3
    Expert éminent Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    2 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 2 708
    Points : 8 198
    Points
    8 198

    Par défaut

    Salut shoooryuken.

    Citation Envoyé par shoooryuken
    Toutefois, entre le moment ou l'utilisateur consulte les plages libres, choisit et valide, il peut se passer plusieurs secondes, voir minutes.
    Que ce soit, une microseconde, une seconde, une minute ou une heure, bloquer la ligne que vous allez modifier par la suite n'est pas la solution.
    Le principe est le premier arrivé est le premier servie !

    Au niveau du traitement, il est tout à fait normal de faire une lecture non bloquante afin de récupérer les informations dont vous allez traiter.
    Vous faites la saisie à l'écran de ce que vous désirez insérer dans votre table. Par exemple, le détail du rendez-vous.
    Mais au moment de la mise à jour, vous devez être seul à le faire, sinon vous allez écraser ce qu'un autre utilisateur a déjà fait au préalable.

    Vous devez appliquer les vérifications suivantes :

    a) Pour ce qui est du mode transaction:

    1) le moteur de votre base de données doit être "INNODB". Pourquoi ?
    Car le moteur MyIsam ne sait pas gérer les accès concurrents.

    2) vous devez aussi configurer votre fichier my.ini afin d'introduire le type d'accès concurrent que vous désirez gérer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    transaction-isolation = SERIALIZABLE
    A lire : https://dev.mysql.com/doc/refman/5.7...on-levels.html

    3) Apprendre à gérer les accès concurrents :
    à lire : https://dev.mysql.com/doc/refman/5.7/en/commit.html

    Autrement dit, vous ne devez pas utiliser l'autocommit à on.
    Vous débutez par un "start transaction", qui va le désactiver.
    Puis vous faites la mise à jour de votre ligne et ensuite, en fonction de ce que vous désirez faire, soit un "commit" (validation) soit un "rollback" (rejet).

    4) pour la mise à jour, dans le mode transaction, faire un "select" puis après un "update" et terminer par un "commit".
    Après le "select", tester s'il n'a pas été bloqué. Et si c'est le cas, faire alors un "rollback" et recommencer votre saisie.

    5) ou bien, et plus simplement, faire un "select ... for update" et tester s'il y a un blocage après le select.
    Puis juste après le "select", faire un "update" qui va libérer le blocage.

    A lire : http://stackoverflow.com/questions/8...date-behaviour

    b) pour ce qui est du mode fonctionnel :
    6) ne faire la mise à jour que si la ligne en question est disponible.
    Autrement dit, la colonne "rendez-vous" doit être libre !

    Vous devez retenir que la mise à jour de la ligne ne peut se faire que si au préalable vous l'avez bloquée.
    Sans cela, vous ne pouvez pas faire correctement votre mise à jour.
    Et que le blocage doit être le plus court possible afin de ne pas bloquer les autres utilisateurs.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    amateur
    Inscrit en
    mars 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : mars 2014
    Messages : 28
    Points : 27
    Points
    27

    Par défaut

    Rha je savais que j'aurai une réponse d'expert.
    merci à vous, nous avons de quoi lire, apprendre comprendre et avancer.

    Vous êtes des chefs. merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tutoriel sur le BDE ? (et question en même temps!)
    Par Yomane dans le forum C++Builder
    Réponses: 7
    Dernier message: 18/02/2004, 17h39
  2. Que deux événements qui se passent en même temps.
    Par Melchisedec dans le forum Général Algorithmique
    Réponses: 4
    Dernier message: 03/08/2003, 14h24
  3. Lancer deux sons en même temps...
    Par Julien_riquelme dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 03/05/2003, 17h00
  4. 2 fonctions qui tournent en même temps
    Par GOUGOU1 dans le forum C
    Réponses: 7
    Dernier message: 07/12/2002, 18h42
  5. gérer le clic gauche-droite en même temps de la sou
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2002, 22h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo