IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

MaJ d'une base de données en toute sécurité ?


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut MaJ d'une base de données en toute sécurité ?
    Bonsoir.

    Je suis un vrai débutant.
    J'essaye de faire pour le fun une application ASP.Net (VB.Net) qui met à jour des données dans une base.
    En gros, j'ai une base et un formulaire. A travers ce formulaire, je mets à jour une table.

    Ma question est la suivante: les applications "web" étant des applications en mode "déconnecté", comment m'assurer que l'enregistrement sur lequel un utilisateur travaille ne soit pas accessible par un autre utilisateur ?

    Je voudrais éviter que 2 utilisateurs puissent accéder au même enregistrement pour mettre à jour !

    Merci pour votre aide.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Il y a le choix entre solution "optimiste" et solution "pessimiste".
    • La solution pessimiste consiste à mettre un verrou sur l'enregistrement dès qu'on veut entrer en edition. Inconvénients : si l'édition est stoppée, l'enregstriment ne se dévérouillera qu'au bout d'un time-out, et il faut vérifier lors de la mise à jour que le verrou est toujours en place.
    • La solution optimiste consiste à s'assurer lors de la mise à jour que l'enregistrement modifié correspond à celui qui a été lu avant édition.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Il y a le choix entre solution "optimiste" et solution "pessimiste".
    • La solution pessimiste consiste à mettre un verrou sur l'enregistrement dès qu'on veut entrer en edition. Inconvénients : si l'édition est stoppée, l'enregstriment ne se dévérouillera qu'au bout d'un time-out, et il faut vérifier lors de la mise à jour que le verrou est toujours en place.
    • La solution optimiste consiste à s'assurer lors de la mise à jour que l'enregistrement modifié correspond à celui qui a été lu avant édition.

    Bonjour.

    je me suis levé du bon pied ce matin aussi vais-je essayer de partir sur la solution optimiste.
    Si j'ai bien compris, il "suffirait" de s'assurer de mettre un critère dans la requête "update" soit unique n'est-ce pas ? (update table_toto set colonne_titi='...' where critère unique).

    Merci.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par yellowsub122 Voir le message
    Bonjour.

    je me suis levé du bon pied ce matin aussi vais-je essayer de partir sur la solution optimiste.
    Si j'ai bien compris, il "suffirait" de s'assurer de mettre un critère dans la requête "update" soit unique n'est-ce pas ? (update table_toto set colonne_titi='...' where critère unique).

    Merci.
    Oui. Dans la pratique, on ajoute aussi souvent une colonne dédiée de type timestamp ou autre. Lors du chargement de ligne ou de l'objet, tu récupère cette valeur avec le reste. Lors de l'update tu ajoutes une condition dans le where pour mettre à jour que si le timestamp est égal. (ne pas oublier de la mettre à jour aussi). Ensuite en analysant le nombre de requêtes affectées, tu peux dire si tes données étaient à jour ou pas.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    il "suffirait" de s'assurer de mettre un critère dans la requête "update" soit unique n'est-ce pas ? (update table_toto set colonne_titi='...' where critère unique).
    Perso, je vérifie l'égalité de tous les champs lus.
    Sinon, lors des update, on peut toujours utiliser une transaction pour mettre dans l'enregistrement un ticket unique chaque fois qu'on écrit dedans. Il suffit alors de tester que la valeur du ticket n'a pas changé.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Perso, je vérifie l'égalité de tous les champs lus.
    Sinon, lors des update, on peut toujours utiliser une transaction pour mettre dans l'enregistrement un ticket unique chaque fois qu'on écrit dedans. Il suffit alors de tester que la valeur du ticket n'a pas changé.
    d'où l'idée du timestamp ... Car pour tes tables avec 20 colonnes, ça devient barbant à faire.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Merci messieurs pour votre contribution.

    En résumé, si j'ai bien compris, il faut créer une nouvelle colonne dans ma table.
    Lors du chargement de l'enregistrement dans mon formulaire, je mets un flag genre "occupé par Titi à 10:34:45 le 10022010" (un truc unique quoi) dans cette colonne.
    Lors de l'update, je me sers de ce flag unique qui m'assure que j'udpdate bien le bon enregistrement.
    Ce flag m'assure aussi que personne d'autre peut prendre l'enregistrement.

    Si j'ai faux, alors n'hésitez pas à me le signaler. Entre temps, je clos ce sujet.

    Merci encore.

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Car pour tes tables avec 20 colonnes, ça devient barbant à faire.
    En effet, mais j'ai créé un générateur automatique de Command Fill, Update/Insert/Delete à partir d'une table quelconque (enfin, je me limite à Access, Oracle et MySQl).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Lors du chargement de l'enregistrement dans mon formulaire, je mets un flag genre "occupé par Titi à 10:34:45 le 10022010" (un truc unique quoi) dans cette colonne.
    Non, le flag doit être écrit lors de la création ou l'update.
    Lors de l'update, je me sers de ce flag unique qui m'assure que j'udpdate bien le bon enregistrement.
    Ce flag m'assure aussi que personne d'autre peut prendre l'enregistrement.
    Non, on compare le flag lu lors du chargement à celui qui est dans l'enregistrement lors de la transaction d'update.
    L'identité des 2 valeurs t'assure que personne d'autre n'a modifié l'enregistrement entre la lecture et la modification.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Non, le flag doit être écrit lors de la création ou l'update.

    Non, on compare le flag lu lors du chargement à celui qui est dans l'enregistrement lors de la transaction d'update.
    Pourquoi seulement lors de l'update ?
    Si aussi tard, cela signifie qu'entre le chargement de la page (avec les données issues de la base) et l'update, un autre utilisateur peut prendre l'enregistrement en question non ?

    Citation Envoyé par Graffito Voir le message
    L'identité des 2 valeurs t'assure que personne d'autre n'a modifié l'enregistrement entre la lecture et la modification.
    ok mais là, tu ne fais que contrôler si personne d'autre n'a changé ton enregistrement avant toi mais ce que je veux, c'est empêcher toute autre personne de prendre l'enregistrement que j'ai pris avant que je le libère.

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    aussi vais-je essayer de partir sur la solution optimiste.
    ...
    Je voudrais éviter que 2 utilisateurs puissent accéder au même enregistrement pour mettre à jour !
    C'est incompatible, "optimiste" veut dire que :
    La probabilité que 2 utilisateurs modifient simultanément le même enregistrement est si faible qu'on accepte que la saisie de la modification puisse échouer au moment où on fait l'Update dans la base de donnée.

    Si cela ne convient pas, c'est la solution "pessimiste" qu'il faut choisir!
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Bon.

    je clos ce sujet.

    je pensais qu'il y aurait une solution "simple" et "rapide".
    Elle existe sans doute mais comme "simple" et "rapide" sont deux notions subjectives, et que je ne suis pas bon du tout (débutant de chez débutant), je dois considérer qu'elle n'existe pas pour moi.
    Hihihhiih.
    je continue de chercher.


    Merci en tout cas.

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

Discussions similaires

  1. Restaurer une base de données / annuler toute modification
    Par flzox dans le forum Accès aux données
    Réponses: 11
    Dernier message: 05/12/2011, 14h09
  2. Réponses: 3
    Dernier message: 23/05/2008, 11h45
  3. Suppression de toutes les tables dans une base de données
    Par GDMINFO dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2007, 08h24
  4. Réponses: 2
    Dernier message: 08/06/2006, 17h42

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