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

Bases de données Delphi Discussion :

TMyTable + LockTable


Sujet :

Bases de données Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Programmeur Delphi
    Inscrit en
    Octobre 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Programmeur Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 183
    Points : 227
    Points
    227
    Par défaut TMyTable + LockTable
    Slt

    je développe sous Delphi Borland developer studio 2005
    et fiche VLC delphi pour win32

    j'utilise les composants Core Lab (MySql Access - TMyConnection, TMyTable,...)

    voici mon code qui me permet de locker une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    self.MyTable1.LockTable(ltWrite);
    self.MyTable1.Edit;
    et pour la délocker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    self.MyTable1.Post;
    self.MyTable1.UnLockTable;
    lorsque j'exécute 2 applications en même temps (pour tester le lock)
    les 2 applics passent en mode edit
    l'une peut modifier et sauver les données
    l'autre est en attende (normal me direz-vous)
    et voilà, où je veux en venir, je ne sais pas prévenir l'utilisateur de la seconde applic que la table est verouillée..., il est totalement bloqué tant que l'autre utilisateur n'a pas débloqué la table

    j'ai essayé de mettre le edit ou le locktable entre try except, mais sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    try
      self.MyTable1.LockTable(ltWrite);
      self.MyTable1.Edit;
    except
      showmessage('Table locké');
      self.MyTable1.UnLockTable;
    end;
    il n'entre pas ds l'except...

    qqun aurait une idée???

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pourquoi locker la table ?
    Pourquoi ne pas locker juste l'enregistrement sur lequel le programme travail ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre actif
    Homme Profil pro
    Programmeur Delphi
    Inscrit en
    Octobre 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Programmeur Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 183
    Points : 227
    Points
    227
    Par défaut
    oui
    c'est pareil pour moi

    que dois-je faire???

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Au lieu de LockTable utilises Lock qui va juste locker l'enregistrement.

    Mais bon, gérer des accès concurentiel avec des TMyTable, je pense que ce n'est pas la meilleure façon.

    Si tu utilises MySQL 5 ou MySQL 4 avec des tables InnoDB, il vaudrait mieux gérer en utilisant les transactions.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre actif
    Homme Profil pro
    Programmeur Delphi
    Inscrit en
    Octobre 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Programmeur Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 183
    Points : 227
    Points
    227
    Par défaut
    je vais essayé cela
    je te tiens informé
    merci

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Sinon, ne pas faire de Edit\Append mais plutot du UPDATE \ INSERT en SQL ... cela lock tout ce qu'il faut tout seul ... en MyISAM ... et en plus, il est plus facile de tracer toutes les actions explicites SQL que les actions implicite du TMyTable (nous utilisons dans nos applis MySQL à 99% le TMyQuery), il est vrai que cela complique avec les Composants DBWare mais c'est tellement plus propre (et plus facilement portable)

    En général, on ne fait que peu souvent le lock, c'est le dernier qui écrit qui a raison ... d'ailleurs, ayant fait des applications multi-DB, il était impossible de faire un code spécifique pour Oracle, MS SQL, IB et MySQL (exclu aussi le PL/SQL, procédure stockée, qu'il faudrait dupliquer dans les différents langages), donc les locks était fait manuellement (via une colonne en plus tout simplement ou via une table), cela permet en d'afficher dans les listings les enregistrement en cours de visualisation (en orange) et ceux en modification (en rouge), surtout quand tu as plusieurs centaines d'utilisateurs simultanés, il vaut mieux prévenir avant toute tentative de modification (lol, sinon, avec pas de chance, il ne risque de vouloir travailler que sur des enregistrements bloqués) ... d'ailleurs Lock ce n'est qu'en InnoDB et dans une transaction ... (je précise car Rayek ton message laissait supposer que c'était deux solutions différentes)

    Avec les Transactions, cela sera pareil, le dernier aura toujours ses données valider, ceux qui ont saisie entre-temps "perdront" leur modif ... les Transactions servent surtout à grouper un ensemble de requête sur plusieurs tables, et si l'un d'entre elles échoue, aucune n'est validé pour garantir la cohérence des données ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre actif
    Homme Profil pro
    Programmeur Delphi
    Inscrit en
    Octobre 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Programmeur Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 183
    Points : 227
    Points
    227
    Par défaut
    Oui pour l'info
    si je ne réussissais pas avec les lock
    c'était ma dernière solution
    ajout d'une colonne (booléen) me spécifiant si un utilisateur modifie mon tuple pour le moment ou pas...

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Dans cette colonne (un int), tu peux stocker par exmple l'IP de l'utilisateur (voir inet_addr et inet_ntoa des API Windows), ou le SESSION_ID de MySQL qui est unique (bon si le serveur reboote, il repasse à Zéro, je ne l'utiliserais pas pour un lock)

    Mais essaye avec Lock, cela peut necessiter la correction de certaine partie de ton programme ... pour y inclure les transactions
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. LockTable sur RecordSet
    Par bubu92 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 07/10/2011, 09h57
  2. Interblocage et LockTable
    Par tibo372 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 26/02/2008, 10h53
  3. Interblocage et LockTable
    Par tibo372 dans le forum ASP
    Réponses: 2
    Dernier message: 26/02/2008, 09h38

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