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

Firebird Discussion :

LOCK Table dans une procédure stockée


Sujet :

Firebird

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 29
    Points : 27
    Points
    27
    Par défaut LOCK Table dans une procédure stockée
    Bonjour, je souhaite ajouter un lock complet d'une table dans une procédure stockée (Firebird 2.0.3.12981) mais j'obtiens une erreur à la compilation de ma procédure stockée:
    Statement failed, SQLCODE = -104.
    Alors que l'execution de la requete (SELECT * FROM DOCUMENT FOR UPDATE WITH LOCK fonctionne parfaitement en dehors de la procédure stockée. Bien sur, la même procédure sans cette requête est fonctionnelle.

    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
    20
    21
    22
    23
    24
    25
    26
    27
     
    SET TERM ^;
    CREATE OR ALTER PROCEDURE P_CONCATENATION (
      ID_NEW_DOC VARCHAR(25),
      ID_DOC_TO_ADD VARCHAR(25),
      BEFORE_NEW INTEGER
    ) RETURNS (
      ETAT VARCHAR(50)
    )
    AS
      DECLARE VARIABLE C_DOCTYPEID INTEGER;
      DECLARE VARIABLE C_PAGEID INTEGER;
      DECLARE VARIABLE C_MIMEID INTEGER;
      --Nombre de pages du document
      DECLARE VARIABLE NBPAGE INTEGER;
      --Nombre de page du document à ajouter
      DECLARE VARIABLE NBPAGEDOCTOADD INTEGER;
      -- No de page du document conteneur
      DECLARE VARIABLE NOPAGE INT;
     
    BEGIN
     
     SELECT * FROM DOCUMENT FOR UPDATE WITH LOCK;
     ...
      SUSPEND;
    END^
    SET TERM ;^

    Par avance, merci de votre aide.

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bonjour,

    Juste pour savoir, c'est quoi le but ?

    Parce que j'ai l'impression que vous faites ça par réflexe de développeur utilisant des SGBD fonctionnant avec des verrous explicites.
    Firbird est un SGBD multigénérationnel.
    Et je n'ai encore jamais eut besoin de lock une bonne utilisation des transactions permet de couvrir tous mes besoins.
    Par exemple vous avez une transaction Read-write Table stability qui vous permettrait justement de vous réserver l'usage exlusif de vos tables.

    Sinon votre erreur c'est que vous faite un select * dans votre procédure, mais que fait il de résultat ? Vous ne lui indiquez pas de champ destination.

    Donc il faudrait modifier comme suit pour réserver toute la table d'un coup :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    SET TERM ^;
    CREATE OR ALTER PROCEDURE P_CONCATENATION (
      ID_NEW_DOC VARCHAR(25),
      ID_DOC_TO_ADD VARCHAR(25),
      BEFORE_NEW INTEGER
    ) RETURNS (
      ETAT VARCHAR(50)
    )
    AS
      DECLARE VARIABLE C_DOCTYPEID INTEGER;
      DECLARE VARIABLE C_PAGEID INTEGER;
      DECLARE VARIABLE C_MIMEID INTEGER;
      --Nombre de pages du document
      DECLARE VARIABLE NBPAGE INTEGER;
      --Nombre de page du document à ajouter
      DECLARE VARIABLE NBPAGEDOCTOADD INTEGER;
      -- No de page du document conteneur
      DECLARE VARIABLE NOPAGE INT;
      DECLARE IDDOC INTEGER;
    BEGIN
     
     FOR SELECT IDDOC FROM DOCUMENT FOR UPDATE WITH LOCK
      INTO IDDOC
      DO
      BEGIN
      END
     ...
      SUSPEND;
    END^
    SET TERM ;^

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    Bonjour,
    Merci Barbibulle.
    Peut-être ai-je des réflexes de développeur utilisant des sgdb à verrous explicite... mais c'est pas sûr.
    En fouinant sur le web, j'ai réussi à faire exactement comme tu me le signales. En fait, j'ai une application multithreadée en java qui accède aux données. Lors de la montée en charge de l'application, plusieurs threads lance la procédure stockée simultanément et le commit de la transaction se fait après le passage dans la PS. Par conséquent, des index uniques sur unes des tables sont créés en doublons dans la PS et le commit me lance une erreur lors de la validation des index déjà existant, forcément.
    C'est pour cette raison que je souhaite locker les tables dans ma procédure, ce qui empechera firebird de faire des updates alors qu'un autre thread est en cours.
    Quant à une bonne utilisation des transactions, je suis parfaitement preneur de ce genre de fonctionnement, bien évidemment.
    Mais comment puis-je faire pour créer une transaction Read-write Table stability ?
    De plus, Est ce qu'un blocage au niveau de la transaction ne va pas impliquer un blocage de toutes les tables concernées et donc faire attendre des threads inutilement car une seule table à besoin d'être lockée ?

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    bonjour,

    Citation Envoyé par nonilastar Voir le message
    Bonjour,
    Merci Barbibulle.
    Peut-être ai-je des réflexes de développeur utilisant des sgdb à verrous explicite... mais c'est pas sûr.
    C'est souvent le cas des personnes abordant firebird croyant trouver un Oracle gratuit. (je n'ai pas dit que c'était vous hein )

    Citation Envoyé par nonilastar Voir le message
    En fouinant sur le web, j'ai réussi à faire exactement comme tu me le signales. En fait, j'ai une application multithreadée en java qui accède aux données. Lors de la montée en charge de l'application, plusieurs threads lance la procédure stockée simultanément et le commit de la transaction se fait après le passage dans la PS. Par conséquent, des index uniques sur unes des tables sont créés en doublons dans la PS et le commit me lance une erreur lors de la validation des index déjà existant, forcément.
    Vous n'avez pas moyen d'utiliser les générateurs pour l'unicité de cet index ?

    Citation Envoyé par nonilastar Voir le message
    Mais comment puis-je faire pour créer une transaction Read-write Table stability ?
    De plus, Est ce qu'un blocage au niveau de la transaction ne va pas impliquer un blocage de toutes les tables concernées et donc faire attendre des threads inutilement car une seule table à besoin d'être lockée ?
    Oui celà va locker toutes les tables utilisées dans la transaction. C'est donc contraignant (voir même impossible) si vous travaillez sur plusieurs tables.
    En fait il faut avoir conçu l'architecture du programme en connaissant cette contrainte. (Ce qui n'est pas toujours possible).

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    C'est souvent le cas des personnes abordant firebird croyant trouver un Oracle gratuit. (je n'ai pas dit que c'était vous hein )
    Dans le mille : mon appli tourne sur Oracle, SQL Server, PostGresSQL ET Firebird.

    Je vais conserver le mode de fonctionnement décrit au départ du post, ca me convient très bien malgré le fait que ce soit un codage un peu particulier.

    Merci.

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. [ASE] Alter table dans une procédure stockée
    Par malignois dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 01/10/2009, 11h20
  3. [MsSQL2K5] passage d'un nom de table dans une procédure stockée
    Par narutobaka dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 14/11/2008, 13h24
  4. Réponses: 2
    Dernier message: 03/03/2006, 13h41
  5. Problème d'alter table dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/03/2005, 09h19

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