Est-il une différence entre commit et rollback dans une transaction qu'après avoir sélectionne?
le cadre d'application interne que nous utilisons à mon entreprise rend nécessaire de mettre chaque requête SQL dans les transactions, même si je sais qu'aucune des commandes ne fera de changements dans la base de données. A la fin de la session, avant de fermer la connexion, Je m'engage à conclure la transaction correctement. Je me demande s'il y avait une différence particulière si je le ramenais, surtout en termes de vitesse.
veuillez noter que J'utilise Oracle, mais je suppose que d'autres bases de données ont un comportement similaire. Aussi, je ne peux rien faire à propos de l'obligation de commencer l'opération, la partie de la base de code est hors de mes mains.
7 réponses
les bases de données conservent souvent soit un journal avant image (ce qu'il était avant la transaction), soit un journal après image (ce qu'il sera lorsque la transaction sera terminée).) S'il conserve une image avant, celle-ci doit être restaurée sur un rollback. S'il conserve une image après, cela doit remplacer les données en cas de propagation.
Oracle dispose à la fois d'un journal et d'un espace de retour. Le journal des transactions accumule des blocs qui sont ensuite écrits par les rédacteurs de la base de données. Puisque ce sont asychronous, presque rien DB writer liés a un impact sur votre transaction (si la file d'attente se remplit, alors vous pourriez avoir à attendre.)
même pour une transaction de requête seulement, je serais prêt à parier qu'il y a un peu de tenue de dossiers transactionnels dans les zones de roulis D'Oracle. Je soupçonne qu'un rollback nécessite du travail de la part D'Oracle avant qu'il ne détermine qu'il n'y a rien à faire. Et je pense que c'est synchrone avec votre transaction. Vous ne pouvez pas vraiment relâchez les serrures jusqu'à ce que le retour en arrière soit terminé. [Oui, je sais que vous n'en utilisez aucun dans votre transaction, mais la question de verrouillage est pourquoi je pense qu'un rollback doit être entièrement libéré, puis tous les serrures peuvent être libérés, puis votre rollback est terminé.]
d'un autre côté, l'engagement est plus ou moins le résultat attendu, et je soupçonne que le rejet de la zone de recul pourrait être légèrement plus rapide. Vous n'avez créé aucune entrée de transaction, donc le rédacteur de db ne se réveillera jamais pour vérifier et découvrir qu'il n'y avait rien à faire.
moi aussi j'attends que tout s'engager peut être plus rapide, les différences sont mineures. Si mineures, que vous pourriez ne pas être en mesure de les mesurer dans une comparaison côte à côte.
je suis d'accord avec les réponses précédentes qu'il n'y a pas de différence entre COMMIT et ROLLBACK dans ce cas. Il pourrait y avoir une différence négligeable dans le temps CPU nécessaire pour déterminer qu'il n'y a rien à commettre par rapport au temps CPU nécessaire pour déterminer qu'il n'y a rien à faire reculer. Mais si c'est une différence négligeable, on peut l'oublier.
Toutefois, il est intéressant de souligner qu'il y a une différence entre une session qui fait un tas de requêtes dans le cadre d'une transaction unique, et une session qui fait la même chose requêtes dans le cadre d'une série d'opérations.
si un client démarre une transaction, exécute une requête, exécute un rollback de COMMITor, puis démarre une seconde transaction et exécute une seconde requête, il n'y a aucune garantie que la seconde requête observera le même état de base de données que la première requête. Parfois, il est essentiel de conserver une vue uniforme des données. Parfois, obtenir une vue plus actuelle des données est de l'essence. Cela dépend de ce que vous faites.
je sais, je sais, L'OP n'a pas posé cette question. Mais certains lecteurs seront peut-être demander à l'arrière de leur esprit.
en général, un COMMIT est beaucoup plus rapide qu'un ROLLBACK, mais dans le cas où vous n'avez rien fait, ils sont effectivement les mêmes.
La documentation précise que:
- Oracle recommande que vous terminiez explicitement chaque transaction dans vos programmes d'application avec une déclaration de propagation ou de retour en arrière, y compris la dernière transaction, avant de vous déconnecter de la base de données Oracle. Si vous n'engagez pas explicitement la transaction et que le programme se termine anormalement, alors la dernière transaction non engagée est automatiquement annulée. Une sortie normale de la plupart des utilitaires et outils Oracle provoque le courant transaction à engager. Une sortie normale d'un programme pré-compilateur Oracle ne déclenche pas la transaction et s'appuie sur la base de données Oracle pour faire reculer la transaction en cours.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4010.htm#SQLRF01110
Si vous voulez o choisir de faire l'un ou l'autre, alors vous pourriez aussi bien faire la même chose que de ne rien faire, et de l'engager.
Eh bien, nous devons tenir compte de ce qu'un SELECT retourne dans Oracle. Il y a deux modes. Par défaut, un SELECT renvoie les données telles qu'elles apparaissent au moment même où L'instruction SELECT commence à être exécutée (il s'agit du comportement par défaut dans le mode D'isolement en lecture engagée, le mode transactionnel par défaut). Ainsi, si une mise à jour / insertion a été exécutée après que SELECT a été publié qui ne sera pas visible dans le jeu de résultats.
Cela peut être un problème si vous avez besoin de comparer deux ensembles de résultats (par exemple debta et les crédits d'une application de grand livre général). Pour cela, nous avons un deuxième mode. Dans ce mode, sélectionnez renvoie les données au moment où la transaction en cours a commencé (comportement par défaut dans les niveaux D'isolation en lecture seule et sérialisable).
ainsi, au moins parfois il est nécessaire d'exécuter des SELECTs dans la transaction.
puisque vous n'avez pas fait de DML, je soupçonne qu'il n'y aurait pas de différence entre un COMMIT et un ROLLBACK dans Oracle. De toute façon il n'y a rien à faire.
je pense qu'un Commit serait plus efficace; puisque généralement vous vous attendez à ce que la plupart des transactions DB soient engagées; donc vous pensez que le DB optimise pour ce cas (au lieu d'essayer d'être plus efficace pour un rollback).