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 :

Oracle et les transactions


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Points : 120
    Points
    120
    Par défaut Oracle et les transactions
    Bonjour,

    Je ne comprends pas comment fonctionne les transactions en Oracle.
    D'après les essai que j'ai fait, les transactions ne sont pas bloquants, contrairement à MySQL.

    Par exemple, si j'ai 2 sessions qui font :
    n=select max (id) from matable;
    n=n+1;
    insert into matable(id) values (n);
    commit;

    L'une des sessions va fonctionner, et l'autre va planter en indiquant qu'il y a un problème d'unicité sur la clef primaire.
    Même en mettant le niveau d'isolation serializable, l'une des deux va planter.

    N'y a t il pas un moyen de bloquer une des deux sessions au select pour qu'il attende que la 2eme session finisse son travaille ?

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Sous Oracle, le comportement par défaut de verrouillage, et d'isolation des transactions, a les caractéristiques suivantes :
    - les verrous portent uniquement sur les lignes modifiées (par INSERT, UPDATE ou DELETE). Les lignes non concernées ne subissent aucun verrou.
    - les SELECT ne provoquent aucun verrou
    - le fait qu'une ligne soit verrouillée à cause d'une modification non encore validée n'empêche pas qu'une autre session puisse lire cette même ligne ; seulement elle verra les valeurs en vigueur avant la modification (qui sont récupérées à partir des segments d'annulation).
    - une session S1 ne peut voir les effets d'une transaction effectuée par une session S2 qu'une fois que S2 aura validé sa transaction par COMMIT
    - les verrous sont libérés à la fin de la transaction (COMMIT ou ROLLBACK)

    Autrement dit, la seule situation qui provoque un blocage, c'est lorsque 2 sessions tentent de modifier simultanément une même ligne.

    Compte tenu de tout ça, votre situation est normale :
    Disons que la session S1 réussit à insérer 11 à la ligne 100 (choisie au hasard), qui devient donc verrouillée, mais le COMMIT n'a pas encore eu lieu.
    S2 ne peut voir que les valeurs validées, et récupère donc 10, l'incrémente à 11, et réussit à l'insérer à la ligne 101 (choisie au hasard), qui devient donc verrouillée sans souci puisqu'il ne s'agit pas de la même ligne. Par contre à la vérification de la contrainte d'unicité, ça ne passe pas !

    Dans votre cas, la bonne solution est d'utiliser une séquence, ce qui aura 2 avantages : ça sera nettement plus performant que de faire un SELECT MAX dans la table, et ça vous garantira des identifiants uniques.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Points : 120
    Points
    120
    Par défaut
    Merci, c'est très clair.

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

Discussions similaires

  1. Oracle et les transactions
    Par tulipebleu dans le forum JDBC
    Réponses: 1
    Dernier message: 28/12/2010, 10h56
  2. Choisir Oracle ou Sql-Server pour les transactions ?
    Par Roronoa01 dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 06/11/2005, 22h41
  3. petite aide sur les transactions et triggers SVP
    Par CharleLéo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2004, 20h43
  4. les Transactions sous interbase
    Par kouraichi35 dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/10/2004, 11h15
  5. [interbase] gerer les transactions
    Par webbulls dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/05/2004, 18h27

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