N'Oracle annuler la transaction sur une erreur?
Cela se sent comme une question stupide, mais je vois la suite de l'Oracle des concepts guide sur la gestion de la transaction:
Une transaction se termine lorsque l'un des
suivants se produit:Un utilisateur émet une instruction COMMIT ou ROLLBACK
instruction par un point de sauvegarde de la clause.Un utilisateur exécute une instruction DDL comme
CRÉER, supprimer, RENOMMER ou MODIFIER. Si l'
transaction en cours contient tout DML
états, Oracle première commet l'
transaction, puis s'exécute et s'engage
l'instruction DDL, comme une nouvelle, unique
déclaration de transaction.Un utilisateur se déconnecte d'Oracle. L'
transaction en cours est engagée.Un processus utilisateur se termine de façon anormale.
La transaction en cours est roulé
retour.
Suis-je pour interpréter le dernier point pour dire que si je émettre une requête qui a une erreur, la transaction permettra d'obtenir restaurées?
Dites-moi, pourquoi êtes-vous à l'aide de transactions si vous ne voulez pas un retour en arrière sur les erreurs? C'est l'une des principales fins de transactions.
Je n'ai pas forcément envie ou pas envie. Je veux juste savoir comment ils fonctionnent.
c'est Oracle - vous de toujours utiliser des transactions.
Strictement parlant, vous êtes toujours en utilisant les transactions de base de données relationnelle, c'est juste que le nombre d'interfaces de validation de chaque instruction.
OriginalL'auteur Jason Baker | 2009-09-23
Vous devez vous connecter pour publier un commentaire.
"Utilisateur" dans ce contexte se réfère au processus en cours d'exécution sur la machine client qui crée la connexion à Oracle. En d'autres termes, si vous utilisez UNE Application (
SQL*Plus
, CRAPAUD, etc.) pour vous connecter à Oracle, le processus utilisateur estSQL*Plus
, CRAPAUD, etc. Si l'utilisateur processus meurt pendant que vous étiez au milieu d'une transaction, la transaction sera annulée. Ce sera le cas dès que PMON découvre que le client est mort, ce qui peut prendre un peu de temps, il n'est pas toujours trivial pour Oracle de distinguer l'échec d'un processus utilisateur à partir d'un processus utilisateur qui n'est tout simplement pas l'émission de commandes pour le moment.OriginalL'auteur Justin Cave
c'est une question intéressante !
Lorsque Oracle rencontre une erreur, il annulera le courant déclaration, pas la transaction. Une instruction aucun niveau d'instruction, il peut être une instruction SQL (INSERT, UPDATE...) ou un PL/SQL bloc.
Cela signifie que lorsqu'un énoncé (par exemple un pl/sql procédure appelée à partir de java) renvoie une erreur, Oracle mettra à la transaction, dans la même logique de l'état qu'avant l'appel. Cela est extrêmement utile, vous n'avez pas à vous soucier de la moitié exécuté les procédures (**).
Ce fil de discussion sur AskTom couvre le même sujet:
Cette fonctionnalité, à mon avis, c'est pourquoi il est beaucoup plus facile d'écrire du code de base de données (*) en pl/sql que dans toute autre langue.
(*) code qui interagit avec une DB Oracle, bien sûr, je suppose que le natif de langues procédurales de l'autre SGBD ont des caractéristiques similaires.
(**) Il s'agit des seuls DML depuis DDL ne sont pas transactionnels dans Oracle. Attention aussi à certains SGBD les packages de mise à jour du dictionnaire de données (tels que
DBMS_STATS
), ils le font souvent de type DDL changements et le problème s'engage. Reportez-vous à la la documentation en cas de doute.Mise à jour: ce comportement est l'un des plus importants concept en PL/SQL, je vais vous donner un petit exemple pour démontrer la l'atomicité de la pl/sql:
Oracle a roulé la transaction pour le moment juste avant l'appel de p1. Il n'y a pas de demi-travail effectué. C'est comme si la procédure p1 n'avait jamais été appelé.
Christian, c'est faux. Si une exception est déclenchée par un haut niveau de PL/SQL bloc, comme appelé par un client, il y a alors un retour en arrière au point avant l'invocation de ce bloc (en supposant que il n'y a pas eu de s'engager dans l'intervalle, PL/SQL).
J'ai mis à jour ma réponse, j'espère que cela permettra de clarifier le concept que j'essayais d'expliquer.
nous parlions DML ici, pas de DDL. Je pense que c'était clair d'après le contexte (la transaction), mais je vais le préciser dans ma réponse.
OriginalL'auteur Vincent Malgrat
Je suis d'accord avec Justin, son intuition est correcte. L'ajout d'informations supplémentaires: en tant Que développeur de l'application, vous devez appeler explicitement une commande rollback si des erreurs se produisent. Cela signifie, vous devriez également considérer le regroupement des états dans transactionnelle blocs selon le cas. Transactionnelle blocs et les restaurations sont traitées différemment par différentes technologies, il vaut la peine de la recherche pour assurez-vous que vous comprenez bien.
OriginalL'auteur Jay