Par habitude, j'ai utilisé des blocs try/catch dans mon code d'application pour toutes les requêtes SQL, avec une restauration au début du bloc catch. J'ai aussi engagé ceux qui ont du succès. Est-ce nécessaire pour SELECT
s? Libère-t-il quelque chose du côté de la base de données? Les instructions select ne modifient aucune donnée, cela semble donc inutile, mais il y a peut-être une raison que je ne connais pas.Dois-je annuler les instructions SELECT qui ont échoué ou les valider?
par exemple.
try {
$results = oci_execute($statement)
oci_commit($connection);
return $results;
}
catch {
oci_rollback($connection)
throw new SqlException("failed");
}
@Quassnoi: Eh bien, c'est possible. Si l'on ouvre un curseur, on gardera l'annulation (UNDO) pour chaque transaction qui était en vol depuis que le curseur a été ouvert. Donc, si l'on ouvre des jeux d'enregistrements, il faut les fermer quand cela est fait afin d'aider les pauvres DBA à éviter le redouté ORA-01555. Dans certains systèmes de base de données (je vous regarde, DB2), vous devez valider après la sélection pour éliminer les verrous de lecture. C'est probablement là que la norme de codification a évolué, ou simplement la paranoïa pure. –
@Adam paranoïa dans mon cas –
@Adam: le 'UNDO' est généré par les autres transactions, pas celle qui maintient le curseur (on suppose qu'il est en lecture seule). Les autres transactions peuvent altérer les données, modifier les pages de données (dans ce cas, le 'UNDO' sera généré et conservé jusqu'à la fin de la transaction) et valider (dans ce cas le' UNDO' est libéré et marqué comme libre de réécrire). Dans un curseur en lecture seule, 'ORA-01555' peut uniquement être généré si les données requises par le curseur ont été remplacées par une transaction simultanée validée. Encore une fois, le curseur lui-même ne verrouillera pas les données, ne générera aucun 'UNDO' ou même verrouillera' UNDO' dont il a besoin. – Quassnoi