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 :

Comment bloquer en lecture une table en attente d'un update?


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut Comment bloquer en lecture une table en attente d'un update?
    Bonjour,
    Sur un projet de site web où les rédacteurs sont multiples, et lors de la création d'un nouvel enregistrement, nous devons d'abord lire la valeur max d'une colonne Ordre dans la table articles, la passer dans une variable qu'on incrémentera puis on fait un INSERT avec toutes les valeurs du formulaire et comme valeur de articles.Ordre celle qui est dans la variable.

    Je n'ai pas de problème pour le faire, le problème que je veux éviter c'est que si deux utilisateurs (ou plusieurs) ajoutent des articles au même moment (je sais que c'est pratiquement rare, voire impossible), je voudrais faire en sorte que le premier à lancer la création lise la valeur et fasse l'insert mais qu'entre-temps les autres utilisateurs soient mis en attente pour lire de la table la valeur de Ordre pour ne pas avoir deux enregistrements avec le même numéro d'ordre.

    J'ai compris qu'il fallait une histoire de blocage et d'arrêt de blocage avant le SELECT et après l'INSERT mais je n'ai pas trouvé comment le faire avec MySql.

    Merci,

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Cette façon de faire est complétement débile et a été discuté mainte fois comme chose à ne JAMAIS faire !

    Voici un article sur ce sujet et une solution particulièrement efficace :
    https://sqlpro.developpez.com/cours/clefs/

    Si vous vous étiez donné la peine de chercher, vous l'auriez trouvé tout seul !

    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,

    Sans dire merci pour avoir fait apparaître ma débilité.

    Je suis débile, peut-être, mais ce n'est que faute d'avoir mal expliqué.

    Ma table contient déjà un ID en auto-increment. La colonne Ordre me sert à autre chose. C'est un site de news, les articles sont saisis par les rédacteurs au fur et à mesure lors de la journée, il ne doivent paraître qu'à partir du lendemain à minuit. Seulement, ils auront un ordre d'importance, donc un ordre suivant lequel ils devront être listés. Du plus important (en haut) vers le moins important (en fin de liste) et ce n'est qu'avec cette colonne Ordre qu'il est possible de gérer leur ordre d'affichage.

    Donc je répète ma question. Est-ce qu'il y a un moyen pour autoriser le blocage de la lecture d'une table de façon à ce qu'un article créé doit auparavant lire une variable dans celle-ci avant d'être enregistré?

    Merci,

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Si à chaque insert tu lis la table, récupères la valeur d'une colonne, l'incrémentes et utilises cette valeur comme ordre d'affichage, il me semble que l'ordre en question est tout simplement l'ordre d'insertion des articles dans la base.
    Donc pourquoi ne pas utiliser un horodatage, avec une colonne dont la valeur par défaut est le "timestamp" courant ?
    Je doute que 2 utilisateurs arrivent à insérer un article dans la même milliseconde. Et si c'est le cas, "peu importe" l'ordre d'affichage pour ces deux articles, car ici il se joue un peu sur un lancé de dé.

    Tatayo.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par kabkab Voir le message
    Seulement, ils auront un ordre d'importance, donc un ordre suivant lequel ils devront être listés. Du plus important (en haut) vers le moins important (en fin de liste) et ce n'est qu'avec cette colonne Ordre qu'il est possible de gérer leur ordre d'affichage.
    Sur quel(s) critère(s) est attribuée l'importance d'un article ? est-ce une action humaine (choix du rédacteur en chef par exemple) ou un algorithme ?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    @tatayo, on a plusieurs catégories dans notre site (actualité nationale, internationale, sports...). L'ajout des articles se fait de façon aléatoire selon la disponibilité des articles : on suppose que, à une date, le rédacteur d'une rubrique introduise un article destiné à paraître en haut de la liste en premier puis un autre article de moindre importance en second lieu mais le lendemain l'ajout se fait selon un autre ordre (l'ajout des articles se fait de façon aléatoire, c'est les aléas du journalisme...).

    @escartefigue, l'ordre est établi par une action humaine. Une fois que tous les articles de la journée sont enregistrés, l'administrateur (rédacteur en chef) change l'ordre de l'affichage.

    Pour clore le débat sur le choix de la rubrique Ordre, on ne peut pas faire autrement. L'administrateur attend que tous les articles soient saisis pour qu'il change l'ordre d'affichage.

    Je reviens donc sur la faisabilité de la procédure. Jusqu'à maintenant, c'est vrai, je ne cherchais pas à passer par le blocage temporaire mais la structure a changé dans notre entreprise et les intervenants sur le site sont plus nombreux et j'ai peur qu'il y ait collision sur la valeur de Ordre.

    Merci,

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Si on envisage qu'un même article puisse faire l'objet de plusieurs publications, une solution possible est de créer une table de lien entre article et publication, c'est dans cette table que la priorité (le numéro d'ordre) est attribué.
    L'avantage est que les rédacteurs peuvent continuer à créer ou modifier des articles (ils n'accèdent pas à cette table de lien qui n'est utilisée que par l'appli de priorisation) et aussi qu'un même article peut être de priorité haute dans telle publication et de priorité moins haute dans telle autre.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Voilà ce que je fais avec laravel

    Code php : 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
    $payload = $request->only(
                'titre', 'text', 'resume', 'visible', 'position', 'ordre', 
                'image_text', 'image_visible', 'categorie_id',
                'publication_date', 'player_id', 'video_url', 'surtitre', 'commentable'
            );
     
    // JE CHERCHE A BLOQUER LA LECTURE DE LA TABLE DE FACON A CE QUE 
    // LA VALEUR DE articles.ordernum NE SOIT PAS UTILISE
    // PAR UN AUTRE UTILISATEUR
     
    $ordernum = Article::select('order_num')->max('order_num')+1;
    $article = new Article($payload);
    $article->order_num = $ordernum;
    $article->save();
     
    // APRES LA SAUVEGARDE JE LIBERE LA TABLE

    Je vous assure que la méthode telle que présentée est celle que j'ai reçue sur pas mal de versions de développement de notre site.
    Elle fonctionne parfaitement mais le risque de collision existe et peut-être que je m'inquiète pour rien mais la véritable question est : Est-ce qu'il y a un moyen de s'approprier la lecture/écriture sur une table MySql et de la libérer ensuite?
    Pour avoir développé des applications multi-utilisateurs sur Windev, c'est cette méthode que j'utilisais lors des créations avec lecture auparavant en table unique ou multi-tables.

    Merci,

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Oui, on peut explicitement verrouiller toute la table

    cf. https://dev.mysql.com/doc/refman/8.0...ck-tables.html

    Car la méthode que vous utilisez n'est pas fiable

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/08/2009, 15h55
  2. Bloquer la lecture sur table un élément d'une table
    Par Blount dans le forum Requêtes
    Réponses: 0
    Dernier message: 01/09/2008, 10h07
  3. Comment ajouter un enregistrement à une table et modifier les autres
    Par Pepitos dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 20/03/2007, 18h53
  4. Réponses: 2
    Dernier message: 02/05/2006, 09h50
  5. comment extraire donnee d'une table sur un fichier
    Par 80stephanie dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 18/03/2006, 11h50

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