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

PL/SQL Oracle Discussion :

Tuer le LOCK d'une autre session


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut Tuer le LOCK d'une autre session
    Bonjour à Tous,

    Prière de m'aider à résoudre ce problème, car je suis planté ça fait 2j .

    En fait, mon problème est de tuer le verrouillage à partir d’une session « S2 » sachant qu’il a été obtenu à partir d’une session « S1 » en utilisant les fonctions du package dbms_lock

    Donc « S1 » lance ces 2 instructions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dbms_lock.allocate_unique(mon_contexte, handle);
    status := dbms_lock.request(handle, dbms_lock.X_MODE, li_timeout);
     
    --status = 0 ==> lock établi / status=1 :'Timeout' / status=2 : 'Deadlock' / status=3 : 'Parameter Error' / status=4 :'Lock déja obtenu' / status=5 : 'Illegal Lock Handle'

    « S1 » peut libérer son propre verrouillage en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     dbms_lock.allocate_unique(mon_contexte, handle);
     status := dbms_lock.release(handle);
    Mais « S2 » ne peut pas libérer le verrouillage obtenu par « S1 » en utilisant la fonction « dbms_lock.release() » ;

    ==> Donc mon objectif est : à partir de la session « S2 » je tue le lock obtenu à partir de la session « S1 » tout en gardant la session « S1 » en vie (càd tuer uniquement le process du lock sans tuer toute la session).

    Merci d’avance pour votre aide

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Je ne pense pas que c'est possible parce que
    RELEASE Function

    This function explicitly releases a lock previously acquired using the REQUEST function
    Donc qu'est-ce que vous essayez d'accomplir ?

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Donc qu'est-ce que vous essayez d'accomplir ?
    Bonjour,

    Merci mnitu pour la réponse.

    En fait, je veux que la session S2 soit la session maitre, elle est toujours la prioritaire à exécuter le Bloc X.

    Donc je ne veux pas que S2 attends la fin d'exécution du Bloc X par S1 ==> existe-il une instruction s'exécutant en mode NOWAIT pour assurer ce comportement.

    Merci beaucoup

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Ca reste assez vague. Actuellement la session S1 acquiert un verrou exclusif. Ensuite probablement qu'elle exécute quelque chose. Elle pourrait peut être interroger régulièrement pour voir si la session S2 il lui demande de libérer ce verrou. Mais ...

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Ca reste assez vague.
    je vais simplifier mon problème avec le scénario suivant:

    Session S1 :
    1/ faire un Lock sur un ensemble de données qu'on appelle D1
    2/ Modifier D1
    3/ COMMIT
    4/ Release Lock

    On suppose que le temps entre l'étape 3 et 4 est négligeable.

    L'étape 2 (représente le bloc X) prend beaucoup de temps, et je ne veut pas utiliser le paramètre timeout de la fonction dbms_lock.request appelée à partir de S1 qui assure le comportement que vous avez mentionné :
    Elle pourrait peut être interroger régulièrement pour voir si la session S2 il lui demande de libérer ce verrou.
    La Session S2 represente un super user qui a la possiblité de modifier les données en 1er lieu ;
    S2 sait que S1 la bloque (car dbms_lock.request executée sur S2 retourne 1)
    ==> donc S2 veut tuer le lock imposé par S1, et acquérir son propre lock.

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Vous avez donc besoin d'un sort de mécanisme d'intercommunication entre les deux sessions. Pour que la deuxième session puisse demander à la première de libérer le verrou exclusif. Et vous devez commencer par définir ce que la session S1 est supposé à faire dans ce cas, se mettre en attente, abandonner, etc.

  7. #7
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    On ne peut pas tuer le lock d'une autre session mais on peut tuer l'autre session: chercher la session dans v$lock puis la killer.
    De toute façon il faudra bien que l'autre session fasse un rollback.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    S'il est inenvisageable de tuer la session S1, peut être qu'une solution de contournement serait de passer par un job.
    Au lieu de lancer directement le code, S1 le soumet via un job, S2 pourra alors arrêter le job si nécessaire.
    Cependant le rollback du travail effectué par le job pourra être plus long qu'attendre la fin du job en fonction du moment où le stop est demandé.

    Je n'ai pas testé cette idée, à voir déjà si c'est envisageable fonctionnellement.

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il est toujours utile de lire l'ensemble du fil de discussion.
    ==> Donc mon objectif est : à partir de la session « S2 » je tue le lock obtenu à partir de la session « S1 » tout en gardant la session « S1 » en vie (càd tuer uniquement le process du lock sans tuer toute la session).

Discussions similaires

  1. Stopper le processus d'une autre session.
    Par NejNej dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/10/2009, 15h38
  2. ADVANCE_QUEUING: comment envoyer un message à une autre session ?
    Par farenheiit dans le forum Administration
    Réponses: 1
    Dernier message: 17/09/2009, 10h43
  3. Réponses: 2
    Dernier message: 03/09/2009, 17h43
  4. Executer une appli sous une autre session.
    Par rvzip64 dans le forum Delphi
    Réponses: 9
    Dernier message: 31/07/2006, 22h30
  5. Réponses: 4
    Dernier message: 17/03/2006, 18h39

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