web-dev-qa-db-fra.com

oracle - quelles déclarations doivent être commises?

Quelles sont les listes d'énoncés qui doivent être validés avant de poursuivre l'action sur la table afin d'éviter un verrou? Je ne parle pas de transactions complètes avec plusieurs déclarations et de l’intégrité des transactions; je parle plutôt de déclarations uniques.

Je sais que insert devrait être validé mais truncate a un autocommit. Quelle est la liste complète des déclarations à engager?

Besoin d'être engagé (liste de départ):

UPDATE
INSERT
DELETE
49
toop

Commandes DML (Data Manipulation Language) doivent être validées/restaurées. Ici est une liste de ces commandes.

Les instructions DML (Data Manipulation Language) sont utilisées pour gérer les données dans les objets de schéma. Quelques exemples:

INSERT - insert data into a table
UPDATE - updates existing data within a table
DELETE - deletes all records from a table, the space for the records remain
MERGE - UPSERT operation (insert or update)
CALL - call a PL/SQL or Java subprogram
EXPLAIN PLAN - explain access path to data
LOCK TABLE - control concurrency
53
rics

En termes mécaniques, un COMMIT effectue une transaction. C'est-à-dire qu'une transaction est toute l'activité (une ou plusieurs instructions DML) qui se produit entre deux instructions COMMIT (ou ROLLBACK).

Dans Oracle, une instruction DDL est une transaction à part entière simplement parce qu'un COMMIT implicite est émis avant l'exécution de l'instruction, puis à nouveau par la suite. TRUNCATE est une commande DDL, elle n'a donc pas besoin d'une validation explicite car son appel exécute une validation implicite.

Du point de vue de la conception du système, une transaction est une unité de travail. Il peut s'agir d'une ou de plusieurs déclarations DML. Peu importe: seules les transactions complètes nécessitent COMMIT. Émettre un COMMIT n’a littéralement aucun sens si nous n’avons pas achevé toute une unité de travail.

C'est un concept clé. Les COMMIT ne libèrent pas simplement les verrous. Dans Oracle, ils libèrent également des verrous, tels que la liste des transactions intéressées. Cela a un impact en raison du modèle de cohérence de lecture d'Oracle. Des exceptions telles que ORA-01555: SNAPSHOT TOO OLD ou ORA-01002: FETCH OUT OF SEQUENCE se produisent à cause de commits inappropriés. Par conséquent, il est essentiel que nos transactions restent sur des serrures aussi longtemps qu'elles en ont besoin.

11
APC

Les DML doivent être validés ou restaurés. DDL ne peut pas.

http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands

Vous pouvez activer la validation automatique, ce qui n’est à nouveau que pour DML. Les DDL ne font jamais partie des transactions et par conséquent, rien ne vaut une validation/annulation explicite.

truncate est DDL et est donc implicitement validé.

Modifier
Je dois dire pardon. Comme @DCookie et @APC ont déclaré dans les commentaires, il existe sth comme implicite commits pour DDL. Voir ici pour une question à ce sujet sur Ask Tom . Ceci est en contraste avec ce que j'ai appris et je suis toujours un peu curieux de savoir.

6
Fabian Barney

Et un point clé - bien que TRUNCATE TABLE apparaisse comme un DELETE sans clause WHERE, TRUNCATE n’est pas DML, c’est DDL. DELETE nécessite un COMMIT, contrairement à TRUNCATE.

3
John Flack