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 PostgreSQL Discussion :

Récupérer les tuples en les modifiant


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut Récupérer les tuples en les modifiant
    Bonjour,
    Je suppose que ce genre de cas doit exister, mais je n'ai réussi à trouver de solution. Je voudrais modifier un champ sur plusieurs lignes, et récupérer les lignes qui ont été modifiées.

    Plus précisément, j'ai une table avec une clé et un champ statut : un entier avec 3 valeurs (non traité, traitement en cours, traitement effectué). Je veux récupérer un certain nombre d'id (non traités) tout en changeant leur statut à traitement en cours.
    La difficulté c'est que plusieurs clients peuvent s'exécuter en même temps, donc récupérer l'id et changer le statut doivent se faire sans qu'une autre requête puisse atteindre ces mêmes lignes.

    Je ne vois pas comment faire ça de façon sure. Merci d'avance de tout conseil !

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Si vous voulez faire plusieurs opérations consistantes, vous devez englober vos requêtes dans une transaction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BEGIN;
     
    SELECT ... ;
     
    UPDATE ... ;
     
    COMMIT;
    Vous pouvez lire cet article qui vous en dira plus long sur le sujet :
    http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1

    Sachant que le niveau d'isolation par défaut de postgre est repeatable read.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Sachant que le niveau d'isolation par défaut de postgre est repeatable read.
    Non, c'est read committed.

    Pour la question initiale, dans ce mode, une requête du genre UPDATE... WHERE... RETURNING id peut suffire à répondre au problème posé, à mon sens.

    SELECT FOR UPDATE est aussi couramment utilisé, combiné avec la mise à jour et le tout dans une transaction.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut


    Merci pour la correction

  5. #5
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Ah tout simplement. Je ne savais pas que les transactions verrouillaient aussi la lecture aux autres sessions. Par contre l'article précise qu'il vaut mieux faire ce genre de requête en procédure stockée pour éviter un deadlock, mais j'imagine que qu'en cas de perte de connexion le serveur effectue un rollback et termine la transaction automatiquement non ?

    La requête UPDATE... WHERE... RETURNING est exactement ce dont j'ai besoin, elle me semble plus simple à utiliser que SELECT FOR UPDATE. Pour quelle raison la seconde est couramment utilisée du coup ?

    Edit : je viens de réaliser qu'on ne peut pas mettre de LIMIT dans une requête UPDATE, donc ça fait déjà une raison d'utiliser SELECT FOR UPDATE à la place.

Discussions similaires

  1. Récupérer dernier tuple inséré ou modifié
    Par Supgeek01 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 11/04/2013, 11h20
  2. Réponses: 7
    Dernier message: 20/10/2010, 19h05
  3. Réponses: 2
    Dernier message: 22/08/2007, 12h46

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