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

Requêtes MySQL Discussion :

MyIsam Style de Transaction


Sujet :

Requêtes MySQL

  1. #21
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Just test it !

  2. #22
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Résultat du test :

    Cela fonctionne parfaitement !

    Pour exemple voici le code que j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SET AUTOCOMMIT=0;
    SET @id = (SELECT max(sequence)+1 FROM Table1 where lieu=1 for update) ;
    INSERT INTO Table1 (sequence,lieu) VALUES (@id,1) ;
    COMMIT;
    Merci tout le monde

  3. #23
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Cette façon de faire est particulièrement catastrophique pour la montée en charge.
    En effet, pour assurer le calcul du MAX il faut verrouiller la table intégralement afin de s'assurer que personne ne va ni modifier, ajouter ou supprimer une ligne, ni lire la table en parallèle et donc obtenir la même valeur. Bref, lors de la montée en charge cette solution va bloquer de plus en plus de processus concurrent, jusqu'à devenir un point de contention dramatique....
    J'ai déjà expliqué à de multiples reprise dans mes papier que la MAX + 1 était une hérésie et qu'il existait une technique fiable, ultra rapide et indolore d'un point de vue de performances quelque soit la volumétrie de la table.
    Donnez vous au moins la peine de lire la chose :
    http://sqlpro.developpez.com/cours/clefs/

    A +

  4. #24
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Je ne pense pas que tu aies besoin du FOR UPDATE, qui va verrouiller inutilement toutes les lignes où lieu = 1.

  5. #25
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Beh si l'avantage du est d'etre certain d'obtenir que le max(sequence)+1 soit unique.

  6. #26
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Oula SQLpro .....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    J'ai déjà expliqué à de multiples reprise dans mes papier
    J'ai l'impression d'etre un élève qui se fait gronder par son professeur parcequ'il dormait en cours !

    Désole de ne pas avoir trouver ton tuto ...

    Je vais quand meme le lire.

  7. #27
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Cette requête "incrément MAX + 1" dans developpez.net

    http://www.google.fr/search?as_q=inc...s=&safe=images

    remonte 367 pages...

    La même dans developpez.com :

    http://www.google.fr/search?hl=fr&as...chercher&meta=

    remonte le papier que j'ai écrit en 2e position.

    D'où l'utilité des moteurs de recherche !

    A +

  8. #28
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Aprés lecture de ton article, je ne me retrouve absoluement pas dans les problèmes que tu exposes. Mon cas est spécifique et je ne l'ai pas exposé en entier dans ce post, vu que ce n'était pas le but de celui-ci.
    Il est vrai que le fait d'adjoindre une table secondaire pourrait faciliter la monté en charge, mais c'est une action qui peut faite plus tard.

    Merci quand meme pour ton article.

  9. #29
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    SQLPro... je te trouve trés agressifs dans tes messages.
    Pour ne pas enchérir dans une polémique qui n'existe pas de mon coté, je met ce post en résolu.

    Merci à tout le monde pour son aide.

  10. #30
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par rvzip64 Voir le message
    Beh si l'avantage du est d'etre certain d'obtenir que le max(sequence)+1 soit unique.
    La requête est exécutée de manière atomique, il n'y a donc pas d'écart entre le moment où le max() + 1 est exécuté et celui où l'insertion est faite.

    Ton FOR UPDATE n'aura pour effet que de verrouiller des lignes qui n'ont pas besoin de l'être.

    Enfin, mettre une clé unique est le moyen absolu de t'assurer de l'unicité...

  11. #31
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    ok, je comprend ce que tu veux dire Antoun.
    Pourtant si je fais des essais avec deux clients et que je ne met pas "For Update" je me retrouve avec la meme valeur de max(sequence)+1

  12. #32
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Enfin, mettre une clé unique est le moyen absolu de t'assurer de l'unicité...
    J'me disais bien aussi ...

  13. #33
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par rvzip64 Voir le message
    ok, je comprend ce que tu veux dire Antoun.
    Pourtant si je fais des essais avec deux clients et que je ne met pas "For Update" je me retrouve avec la meme valeur de max(sequence)+1
    En fait, tout ce que je dis n'est valable que si tu es en mode autocommit où chaque requête est une transaction. Mais je comprends maintenant que ce n'est plus le cas...

  14. #34
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Je ne peux pas mettre ce champ dans une clef unique, vu que justement il ne l'est pas, il recommence à zéro pour chaque nouveau lieu.
    (Ma clef primaire est un champ auto_increment de ma table)

  15. #35
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Vois l'essai que je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Client 1 :START TRANSACTION;
    Client 2 :START TRANSACTION;
     
    Client 1 : SELECT max(sequence) FROM TABLE WHERE lieu=1
        résultat = 5
     
    Client 2 : SELECT max(sequence) FROM TABLE WHERE lieu=1
        résultat = 5
     
    Client 1 : Insert ....
    Client1: COMMIT;
     
    Client 2:Insert ....
    Client 2 : COMMIT;

  16. #36
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par rvzip64 Voir le message
    Je ne peux pas mettre ce champ dans une clef unique, vu que justement il ne l'est pas, il recommence à zéro pour chaque nouveau lieu.
    (Ma clef primaire est un champ auto_increment de ma table)
    Tu dois poser une clé unique sur la combinaison (lieu, sequence).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE machin ADD UNIQUE KEY (lieu, sequence) ;

  17. #37
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par rvzip64 Voir le message
    Vois l'essai que je fais
    ... tu n'es donc pas en autocommit - et donc, il te faut effectivement le FOR UPDATE.

  18. #38
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    ok j'ai compris..

    Je met donc un petit résolu.

    Merci encore une fois à tout le monde.

  19. #39
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Ceci dit, pour aller dans le sens de SQLpro, c'est une dénormalisation dont l'intérêt reste à prouver. Tu pourrais ne pas stocker du tout ce numéro de séquence et le calculer dynamiquement ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT lieu, T1.id, COUNT(*) AS sequence
    FROM machin T1
      INNER JOIN machin T2 ON T1.lieu = T2.lieu AND T1.id >= T2.id
    GROUP BY lieu, T1.id

  20. #40
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Non Autoun, le problème est particulier et je ne peux pas faire autrement.
    La requête que tu as fait n'a pas du tout le même but que ce que je cherche à faire.

    Après je comprend tout à fait que cette dénormalisation puisse en choquer plus d'un, mais dans des cas particuliers, on ne peut pas toujours la suivre.

    Par contre je suis entièrement d'accord avec SQLPro, l'ajout d'une seconde table pour gérer les compteurs est une très bonne idée. J'avais déjà eu l'idée avant, et le fait que dans son article, il soutienne cette théorie me conforte dans la mise en place d'un tel système.

    Autrement l'aide que vous m'avez apporté et la solution que j'ai mise en place me convient tout à fait, même si elle a comme inconvénient majeur la monté en charge.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Simuler els transactions sur un table MyISAM
    Par vodasan dans le forum SGBD
    Réponses: 0
    Dernier message: 19/08/2014, 14h39
  2. Réponses: 5
    Dernier message: 20/07/2010, 15h19
  3. InnoDB + Transactions ou MyIsam
    Par Erakis dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 16/02/2006, 20h54
  4. Apropos des Transactions au sein d'un Stored Procedure
    Par Sarbacane dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 16/11/2004, 08h21
  5. Rattacher une feuille de style a un XML existant
    Par aour dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 08/10/2002, 22h07

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