2010-03-04 9 views
6

Por costumbre, he estado usando bloques try/catch en mi código de aplicación para todas las consultas SQL, con una reversión al comienzo del bloque catch. También he estado cometiendo los que tienen éxito. ¿Es necesario para SELECT s? ¿Libera algo en el lado de la base de datos? Las instrucciones seleccionadas no están alterando ningún dato, por lo que parece algo inútil, pero tal vez haya alguna razón por la que no estoy al tanto.¿Debo retrotraer las instrucciones SELECT o comprometer las exitosas?

p. Ej.

try { 
    $results = oci_execute($statement) 
    oci_commit($connection); 
    return $results; 
} 
catch { 
    oci_rollback($connection) 
    throw new SqlException("failed"); 
} 

Respuesta

7

SELECT declaraciones en Oracle (a menos que sean SELECT FOR UPDATE) no bloquear todos los registros y transacciones nunca se abren de manera implícita.

A menos que haya emitido operaciones DML dentro de su transacción, no importará si confirma o retrotrae su transacción.

+0

@Quassnoi: Bueno, puede. Si uno abre un cursor, uno retendrá (UNDO) por cada transacción que estuvo en vuelo desde que se abrió el cursor. Entonces, si uno abre cualquier conjunto de registros, uno necesita cerrarlos cuando haya terminado para ayudar a los pobres DBA a evitar el temido ORA-01555. En algunos sistemas de bases de datos (te estoy mirando, DB2) necesitas confirmar después de seleccionar para eliminar bloqueos de lectura. Probablemente es de allí de donde evolucionó el estándar de codificación, o simplemente paranoia directa. –

+0

@Adam paranoia en mi caso –

+2

@Adam: el 'UNDO' es generado por las otras transacciones, no la que mantiene el cursor (suponemos que es de solo lectura). Las otras transacciones pueden alterar los datos, modificar las páginas de datos (en cuyo caso el 'UNDO' se generará y retendrá hasta el final de la transacción) y confirmar (en cuyo caso,' UNDO' se liberará y se marcará como libre para reescribir) En un cursor de solo lectura, 'ORA-01555' solo se puede generar si los datos requeridos por el cursor fueron sobrescritos por una transacción concurrente comprometida. Una vez más, el cursor en sí no bloqueará los datos, generará cualquier 'UNDO' o incluso el bloqueo' UNDO' que necesite. – Quassnoi

Cuestiones relacionadas