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 :

question de base sur les transactions


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Points : 70
    Points
    70
    Par défaut question de base sur les transactions
    Bonjour a tous,
    revoilà avec une autre question
    d'après ce que j'ai compris sur les transactions , ces derniers ne sont validé ou annulé qu'âpres un commit ou rollback mais dans l'exemple ci-dessous ( traite le probleme de gestion de concurrence) on voit que la modification dans operation1 prend lieu même si on pas encore fait de commit ( ou c'est moi qui a mal compris et on peu faire un commit puis un rollback )



    pourriez vous m'éclaircir ce qui se passe vraiment?
    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Bonjour,


    Tout depend du niveau d'isolation choisie.
    http://download.oracle.com/docs/cd/B...c.htm#g1026777
    Dans votre exemple, on ne fonctionne pas en read commited car la transaction numero 2 lit les valeurs de la 1 qui ne sont pas validees (ou annulees)
    Mais ce probleme vient du schema en lui meme. L'etat de la base n'est pas bon au temps 3, comme la transaction n'a pas valide on ne peut pas avoir une valeur d'inscrite en dur de 1500. Ou alors c'est l'annulation de transaction au point 8 qui est bizarre, en pensant annule un changement qui a deja ete valide.

    De base (avec le mode de transaction classique) ca ne fonctionne pas comme ca.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Session 1:
    FRANCOIS>create table tmp (n number);
    Table created.
     
    FRANCOIS>insert into tmp values (1000);
    1 row created.
     
    FRANCOIS>commit;
    Commit complete.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Session 2:
    FRANCOIS>select * from tmp;
             N
    ----------
          1000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Session 1:
    FRANCOIS>update tmp set n=n +500;
    1 row updated.
     
    FRANCOIS>select * from tmp;
             N
    ----------
          1500
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Session 2:
    FRANCOIS>select * from tmp;
             N
    ----------
          1000
    FRANCOIS>update tmp set n=n +3000;
    La session 2 est bloque car elle veut mettre a jour les memes lignes que la session 1. Tant qu'on ne fait pas un commit ou rollback ca va rester dans cet etat la. De plus, la valeur lue par la session 2 est la derniere valeur consistante de la base (propriete ACID), soit 1000 et non pas 1500.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Session 1:
    FRANCOIS>rollback
      2  ;
    Rollback complete.
    A l'instant ou on fait le rollback, la session 2 se debloque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Session 2:
     
    1 row updated.
     
    FRANCOIS>select * from tmp;
             N
    ----------
          4000
    Edit:
    Je me disais aussi...

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update tmp SET n=(SELECT n FROM tmp) +500;
    Euh.. c'est quoi cette syntaxe ??

    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update tmp SET n= n +500;

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Points : 70
    Points
    70
    Par défaut
    Merci bien je comprends mieux maintenant

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

Discussions similaires

  1. Une question de base sur les sockets
    Par syntaxerror dans le forum Développement
    Réponses: 1
    Dernier message: 05/01/2012, 12h57
  2. question de base sur les pointeurs
    Par Ganondorf dans le forum Débuter
    Réponses: 4
    Dernier message: 26/08/2010, 17h07
  3. question de base sur les classes
    Par tanguy.L dans le forum Langage
    Réponses: 10
    Dernier message: 28/02/2008, 17h37
  4. Réponses: 13
    Dernier message: 10/10/2007, 10h09
  5. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20

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