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

SQL Procédural MySQL Discussion :

Accès concurrents / récupération de crash [FAQ]


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2005
    Messages : 93
    Par défaut Accès concurrents / récupération de crash
    Voilà, 2 problèmes en une question. Je m'explique.

    Disons que J'ai 2 tables INNODB (mysql 4.x), que l'on simplifie:
    Table1
    t1_id (auto-increment)
    t1_description
    ___________
    Table2
    t2_id REFERENCES table1(t1_id)
    t2_description

    J'ai une fonction (en php5) qui insère un nouvel enregistrement. C'est à dire qu'il va rajouter VALUES(1,'blabla) dans Table1 puis (1,'tratra') dans Table2

    Mes questions:
    1. Comment faire pour, s'il y a un crash entre les 2 insert, DELETER le insert que l'on a fait dans Table1 ?
      Comment éviter que qqn d'autre fasse un insert pile au moment où le premier insert (dans table1) a été fait? (si c'est possible, je sais pas)


    merci bcp pour toute réponse. Comme je n'ai pas du tout idée comment faire, même des "mots clés" me sont suffisant, à partir desquels je pourais orienter mes recherches.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Par défaut
    1/ Encapsuler tes 2 requetes dans une transaction.

    2/ renseigne toi sur le systeme de lock sous Mysql.
    Si ta crainte est par rapport à l'auto_increment qui viendrait s'incrémenter entre tes 2 requêtes, reflechis à ton modele de données car ce n'est pas une bonne solution.
    [/code]

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2005
    Messages : 93
    Par défaut
    Merci pour les éléments de réponse! J'ai donc pu faire des recherches...

    Réponse1
    en utilisant le mysql_insert_id() de php pour récupérer l'id de la dernière insertion, il n'y a aucun problème si qqn fait une insertion en même temps (avec une autre connexion) car mysql_insert_id() est propre a la connexion (donc récupère l'id de la dernière insertion dans la même connexion). Donc pas besoin de locker dans ce cas!

    Je vais néanmoins juste préciser...car il me reste un problème.
    Disons que:
    - j'insère une ligne dans table1 (id auto-increment)
    - je récupère l'id grâce à une fonction php: mysql_insert_id() (qui recupère l'id du dernier insert qui a été fait)
    - j'insère une ligne dans table2 avec cet id récupéré en appelant une fonction (donc j'ouvre une connexion)

    Le problème:
    - en cas de crash après l'insertion dans table1, pas de récupération

    Ma question:
    si je fais le 2è insert dans la MEME connexion, et qu'il y a un crash entre les deux, est-ce qu'il y aura un rollback? (donc une suppression de l'entrée de table1?


    Merci bcp!

  4. #4
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Citation Envoyé par -DeN-
    Ma question:
    si je fais le 2è insert dans la MEME connexion, et qu'il y a un crash entre les deux, est-ce qu'il y aura un rollback? (donc une suppression de l'entrée de table1?
    Oui, normalement l'undo log défait au lancement du serveur toutes les modifications qui n'avaient pas été commitées lors du crash.

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2005
    Messages : 93
    Par défaut
    parfait merci, je m'en doutais mais je voulais avoir confirmation! Merci bcp pour votre aide précieuse!

    Néanmoins, il semblerait qu'il faille utiliser un BEGIN...COMMIT dans cette situation. Ceci est possible même si autocommit = 1.

    Voilà, j'en ai appris des trucs! thanks!

  6. #6
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2005
    Messages : 93
    Par défaut
    Bon, j'ai essayé divers scénarios et comme ça marche, je me suis dit que ça serait sympa de partager. Surtout que j'ai mis pas mal de temps avant de trouver.
    Exemple pratique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public static function save_membre($membre, $invitation) {
        try {
          $conn = connexion::get_connexion();
          mysql_query("BEGIN");
          $sql = "INSERT INTO membre(login,password) VALUES (
                '$membre->get_login()',
                '$membre->get_password()'
                ";
          mysql_query($sql, $conn);
          $idMembre = mysql_insert_id();
          invitation_db::save_invitation($idMembre, $invitation);
          mysql_query("COMMIT");
        }
        catch(Exception $e) {
          throw new Exception($e->getMessage());
        }    
        return TRUE;
      }
    Voilà (à peu près) mon code. save_invitation lance une exception si elle s'est mal passée, et donc il faut que tout se passe bien pour arriver au commit (sinon ça va dans le catch et le commit ne se fait pas => rollback du INSERT du membre).

    J'espère que ça sera utile pour qqn. En tout cas, merci de m'avoir aiguillé sur la bonne réponse!

  7. #7
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    pour ce retour d'expérience

  8. #8
    Membre Expert
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Par défaut
    Je dirais même plus "Merci"
    ça mériterait un petit paragraphe dans la FAQ PHP, tip top les transactions implémentées avec la gestion d'exceptions

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

Discussions similaires

  1. accés concurrent à une table
    Par shout dans le forum Oracle
    Réponses: 5
    Dernier message: 06/10/2005, 10h54
  2. Réponses: 22
    Dernier message: 25/08/2005, 16h03
  3. Lenteur et acces concurrent
    Par JeanMarc_T2k dans le forum Bases de données
    Réponses: 7
    Dernier message: 04/12/2004, 20h57
  4. acces concurrent avec delphi 5 entreprise
    Par Jean_paul dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2004, 20h19
  5. [EJB] Accès concurrents à la base de données
    Par cameleon2002 dans le forum Java EE
    Réponses: 10
    Dernier message: 23/09/2003, 11h31

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