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

Oracle Discussion :

Transaction sous oracle


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Points : 16
    Points
    16
    Par défaut Transaction sous oracle
    Bonjour à tous,

    j'ai une question sur la gestion des transactions sous oracle. supposant que je lance une commande select (premiere transaction) et je recupere une valeur X, je fais un update X+1, et je relance un deuxieme select (3ieme transation) ,et là la valeur que je recupere normalement est toujours X car je n'ai pas fait un commit sur le update. mais le pb c'est que si je fais ça sous toad, lors du deuxieme select j'aurai le (X+1) comme resultat, c'est comme si le update est validé, hors que sous toad l'auto commit est off.

    Je veux une explication svp.

    Merci

  2. #2
    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,


    Ce sont 3 requêtes dans une même transaction, et non pas 3 transactions.
    une transaction commence par la première reqête, et se termine par:
    - commit
    - ou rollback
    - ou un DDL (qui fait un commit implicite)
    - fun anormale de la session (qui fait un rollback implicite)

    Donc si tu ne fait pas de commit sur l'update, ta transaction courante voit X+1
    Mais une autre session verra X tant que tu n'as pas commité.

    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

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 286
    Points : 279
    Points
    279
    Par défaut
    La façon dont toad gère ses transactions est paramétrable.
    Soit une transaction par connexion soit une par onglet...
    --
    ... Hello sweetie ...

  4. #4
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Citation Envoyé par pachot Voir le message
    une transaction commence par la première requête, .
    En fait une transaction commence avec la première requête qui écrit dans la base:

    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
    SQL> select count(*) from v$database;
     
      COUNT(*)
    ----------
    	 1
     
    SQL> select count(*) from v$transaction;
     
      COUNT(*)
    ----------
    	 0
     
    SQL> create table tx(x int);
     
    Table creee.
     
    SQL> insert into tx values(1);
     
    1 ligne creee.
     
    SQL> select count(*) from v$transaction;
     
      COUNT(*)
    ----------
    	 1

  5. #5
    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 pifor,

    Désolé ce n'est pas une preuve...

    On sait que LOCK TABLE fait partie d'une transaction (puisqu'il verouille une table pour toute la transaction), et pourtant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL> SELECT count(*) FROM v$transaction;
      COUNT(*)
    ----------
         0
    SQL> lock table test in exclusive mode;
    Table(s) Locked.
    SQL> SELECT count(*) FROM v$transaction;
      COUNT(*)
    ----------
         0


    Et une preuve que la transaction a pourtant bien commencée, j'enchaine avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL> alter session set isolation_level=serializable;
    ERROR:
    ORA-01453: SET TRANSACTION must be first statement of transaction


    Donc transaction pas encore enregistrée dans v$transaction, mais pourtant bien commençée !

    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

  6. #6
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Je ne crois pas que LOCK TABLE écrit dans la base. Quant au libellé du message d'erreur de ALTER SESSION, il n'est peut-être pas si fiable que ça.

    Je me réfère à ce qu'écrit Tom Kyte dans Expert Oracle Database Architecture page 256:

    A transaction implicitily begins with the first statement that modifies data (the first statement that get a TX lock).

  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
    Citation Envoyé par pifor Voir le message
    Je ne crois pas que LOCK TABLE écrit dans la base.
    Justement, il n'écrit pas dans la base, pas de TX lock. Et pourtant il s'agit d'une transaction puisque la table est vérouillée pour toute la transaction.

    isolation_level=serializable est aussi un début de transaction puisque il détermine le début d'un ensemble d'opération qui doivent être isolées des transactions concurrentes.

    Je pense que Tom Kyte fait référence à une transaction active (au sens de la définition de v$transaction qui est ' lists the active transactions in the system') et qui s'enregistre à la premiere modif (lorsque du rollback est généré) accompgné d'un TX lock.

    Et si on regarde start_time dans v$transaction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    07:05:20 KARMA_DEV01_AF> host sleep 60
    07:06:20 KARMA_DEV01_AF> lock table test in exclusive mode;
    Table(s) Locked.
    07:06:20 KARMA_DEV01_AF> host sleep 60
    07:07:20 KARMA_DEV01_AF> delete from test;
    1 row deleted.
    07:07:20 KARMA_DEV01_AF> select ses_addr , start_time , sysdate from v$transaction;
    SES_ADDR         START_TIME           SYSDATE
    ---------------- -------------------- ---------
    00000000BD2B2918 04/28/09 07:06:18    28-APR-09
    La transaction n'est visible qu'à partir du delete, mais son heure de début est bien celle du lock table et non du delete...

    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
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Je pense que LOCK TABLE fait partie de la transaction si et seulement si une opération d'écriture suit: sinon il n'y a pas de transaction. Autrement dit, l'instruction LOCK TABLE ne démarre pas de transaction en elle-même: c'est bien la première écriture qui démarre la transaction et non la première requête SQL: dans ce cas, LOCK TABLE est bien rattaché à la transaction qui démarre.

    Comme le dit Tom Kyte:

    everything is reflected in v$transaction -- the very INSTANT you start a transaction, it is reflected

  9. #9
    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
    Oui, formulé comme ça je suis d'accord .
    D'ailleurs, quand on fait commit, la statistique 'user commits' n'est incrémentée que s'il y a eu une vrai modification.
    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

Discussions similaires

  1. Pas de JOIN sous Oracle (vraiment dommage...)
    Par Isildur dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/03/2007, 11h28
  2. Cryptage de colonnes sous Oracle
    Par Julian Roblin dans le forum SQL
    Réponses: 9
    Dernier message: 28/11/2006, 18h24
  3. [Debutant] transactions sous Oracle
    Par Grand sorcier dans le forum Oracle
    Réponses: 3
    Dernier message: 14/06/2006, 16h18
  4. LOCATE sous Oracle 8
    Par SubZero2 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/05/2004, 13h47
  5. Recherche de texte dans un blob sous oracle
    Par nesbla dans le forum Bases de données
    Réponses: 5
    Dernier message: 25/05/2004, 11h11

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