2012-03-02 14 views
42

¿Cuál es la lista de declaraciones que deben confirmarse antes de realizar más acciones en la tabla para evitar un bloqueo? No estoy hablando de transacciones completas con múltiples declaraciones e integridad de transacciones (en cambio, me refiero a declaraciones únicas).oracle: ¿qué afirmaciones se deben comprometer?

Sé que se debe confirmar la inserción, pero truncar tiene un compromiso automático. ¿Cuál es la lista completa de declaraciones que deben ser comprometidas?

que necesitan ser confirmados (lista de arranque):

UPDATE 
INSERT 
DELETE 
+1

'truncate' elimina datos directamente sin copiarlos en el espacio de tabla de reversión. Es una declaración DDL. – danihp

+2

¿Hay que contratar DCL? es decir, conceder + revocar – toop

+0

Fusionar. También seleccione para la actualización lleva bloqueos, aunque no modifique nada. –

Respuesta

40

Comandos DML (lenguaje de manipulación de datos) need to be commited/rolled back. Here es una lista de esos comandos.

Las sentencias de Lenguaje de Manipulación de Datos (DML) se utilizan para administrar los datos dentro de los objetos de esquema. Algunos ejemplos:

SELECT - retrieve data from the a database 
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 
+2

¿tiene que comprometerse después de SELECT o EXPLAIN PLAN? – toop

+1

@toop Después de un 'SELECCIONAR ... PARA ACTUALIZAR', tienes que desbloquear el bloqueo. –

+1

¿Cómo se ve una selección para la actualización en su totalidad? Además, ¿qué tal solo una selección estándar * de la tabla donde bla? – toop

4

LMD tienen que estar comprometidos o rollback. DDL no puede.

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

Puede cambiar el auto-commit de nuevo y eso es sólo para LMD. DDL nunca forman parte de las transacciones y, por lo tanto, no hay nada como una confirmación/reversión explícita.

truncate es DDL y, por lo tanto, está comprometido implícitamente.

Editar
Lo siento. Al igual que @DCookie y @APC, en los comentarios existe algo así como confirmaciones implícitas para DDL. Vea aquí para una pregunta sobre eso en Ask Tom. Esto está en contraste con lo que he aprendido y todavía me siento un poco curioso.

+1

¿tiene que comprometerse después de SELECT o EXPLAIN PLAN? – toop

+0

Esto es técnicamente incorrecto: DDL siempre emite confirmaciones, y en realidad emiten 2 de ellas, al inicio y al final del proceso. Si emite un enunciado DML, entonces emita DDL, su DML está comprometido. – DCookie

+2

-1. Por supuesto, DDL está comprometido. DDL es esencialmente la emisión de cambios en el diccionario de datos, que deben comprometerse para que puedan aplicarse. La diferencia es simplemente que los commits son implícitos, y como dice DCookie, hay dos de ellos. Entonces, si emitimos una actualización en una tabla y luego ejecutamos una instrucción DDL que falla, no podemos deshacer la actualización. Se ha confirmado aunque no se aplicó el DDL posterior. – APC

8

En términos mecánicos un COMMIT hace una transacción. Es decir, una transacción es toda la actividad (una o más declaraciones DML) que se produce entre dos instrucciones COMMIT (o ROLLBACK).

En Oracle, una sentencia DDL es una transacción en sí misma simplemente porque se emite una COMMIT implícita antes de que se ejecute la instrucción y luego otra vez.

Desde el punto de vista del diseño del sistema, una transacción es una unidad de trabajo comercial. Puede consistir en una única declaración de DML o varios de ellos. No importa: solo las transacciones completas requieren COMMIT. Literalmente no tiene sentido emitir un COMMIT a menos que o hasta que hayamos completado una unidad de trabajo comercial completa.

Este es un concepto clave. Los COMPROMISOS no solo lanzan bloqueos. En Oracle también liberan pestillos, como la Lista de transacciones interesadas. Esto tiene un impacto debido al modelo de coherencia de lectura de Oracle. Excepciones como ORA-01555: SNAPSHOT TOO OLD o ORA-01002: FETCH OUT OF SEQUENCE se producen debido a compromisos inapropiados. En consecuencia, es crucial que nuestras transacciones se cuelguen de las cerraduras todo el tiempo que las necesiten.

1

Y un punto clave - aunque TRUNCATE TABLE parece un DELETE sin cláusula WHERE, TRUNCATE no es DML, es DDL. DELETE requiere un COMMIT, pero TRUNCATE no.

Cuestiones relacionadas