Les Transactions en lecture seule DB accès?
Il semble y avoir des opinions très différentes sur l'utilisation de transactions de lecture à partir d'une base de données.
Citation de la DeveloperWorks article Transaction stratégies: Modèles et stratégies de présentation:
Pourquoi auriez-vous besoin d'une opération si
vous vous contentez de lire les données? La réponse
c'est que vous n'avez pas. Le démarrage d'une
opération à effectuer une lecture seule
l'opération s'ajoute à la surcharge de l'
thread de traitement et peut causer partagé
des verrous en lecture sur la base de données (selon
sur quel type de base de données que vous utilisez
et quel est le niveau d'isolation est défini
d').
Comme une opinion contraire il y a la citation suivante de mise en veille prolongée de la documentation Données Non transactionnelles l'accès et le mode auto-commit
Notre recommandation est de ne pas utiliser le
mode de validation automatique dans une application, et
pour appliquer des transactions en lecture seule uniquement
quand il y a un évident performance
avantage ou lors de futures modifications du code
sont hautement improbable. Préférez toujours
régulière de l'ACIDE transactions de groupe
votre accès aux données des opérations,
indépendamment de savoir si vous lisez ou
l'écriture de données.
Il y a aussi un débat similaire sur la EclipseLink liste de diffusion ici.
Alors, où se trouve la vérité? Sont des opérations pour la lecture de la meilleure pratique ou pas? Si les deux sont des solutions viables, quels sont les critères pour l'utilisation de transactions?
Aussi loin que je peux voir seulement faire une différence si le niveau d'isolation est supérieure au "lire commis". Est-ce correct?
Quelles sont les expériences et les recommandations?
Vous devez vous connecter pour publier un commentaire.
Steven Devijver fourni quelques bonnes raisons pour le démarrage des opérations, même si les opérations sont seulement en cours de lecture de la base de données:
SQL Standard exige que même une requête doit démarrer une nouvelle transaction si aucune transaction n'est en cours actuellement. Il y a des SGBD où ce n'est pas ce qui se passe -, ceux avec un mode de validation automatique, par exemple (l'instruction démarre une transaction et l'engage immédiatement la déclaration complète). D'autres SGBD faire des déclarations atomique (effectivement autocommit) par défaut, mais démarrer une transaction explicite avec un énoncé tel que "COMMENCER la mission", l'annulation de validation automatique jusqu'à ce que le prochain COMMIT ou ROLLBACK (IBM Informix Dynamic Server est un exemple - lorsque la base de données n'est pas en MODE ANSI).
Je ne suis pas certain que le conseil de ne jamais revenir en arrière. Il ne fait aucune différence pour la lecture seule opération, et dans la mesure où il agace vos Administrateurs de base de données, alors il est préférable d'éviter de RESTAURATION. Mais si votre programme se termine sans faire un COMMIT, le SGBD doit faire un ROLLBACK sur votre transaction incomplète - certainement si elle modifié la base de données, et (pour la simplicité), même si vous n'avez sélectionné données.
Dans l'ensemble, si vous voulez changer le comportement par défaut d'une série d'opérations, à l'utilisation d'une transaction, même si la transaction est en lecture seule. Si vous êtes satisfait avec le comportement par défaut, alors il n'est pas crucial pour l'utilisation d'une transaction. Si votre code est portable entre les SGBD, il est préférable de supposer que vous aurez besoin d'une opération.
Tout d'abord, cela ressemble à une optimisation prématurée. Comme Steven l'a souligné, le plus intelligent des bases de données vont vous mettre dans une transaction de toute façon, et tout ce qu'ils sont vraiment en train de faire est d'appeler commit après chaque instruction. De ce point de vue, autocommit est peut-être moins performant depuis chaque instruction a pour démarrer une nouvelle transaction. Ou peut-être pas. Seule l'analyse comparative dira et je parie qu'il n'a rien fait lécher la différence pour votre application.
Une des raisons pourquoi vous voulez toujours utiliser une transaction est la cohérence de la protection. Si vous commencez à se tripoter manuellement la déclaration d'une opération uniquement lorsque vous avez "besoin", puis vous allez à oublier à un moment critique. Ou qui est censé être en lecture seule série d'opérations soudain, n'est-ce pas, soit parce que plus tard programmeur ne savais pas que c'était censé être, ou parce que votre code appelle une fonction qui a une face cachée de l'écriture. Par exemple, j'ai configurer ma ligne de commande de la base de données clients de ne pas autocommit. Cela signifie que je peux gros doigts d'une requête de suppression et encore la restauration.
Il y a le niveau d'isolation, comme l'a souligné. Cela permet de faire plusieurs lectures sans se soucier de savoir si un autre processus a écrit de vos données entre eux de faire votre lit atomique. Cela vous permettra d'économiser de nombreuses heures de débogage d'une condition de course.
Et, enfin, bien souvent, vous pouvez définir une transaction en lecture seule. Ceci permet de vérifier votre hypothèse et l'erreur si quelque chose se met à écrire.
Voici un bel article résumant le tout. Les détails sont Oracle spécifiques, mais les concepts sont génériques.
De Transaction sont nécessaires pour les opérations en lecture seule si vous souhaitez définir un délai spécifique pour les requêtes autres que le délai d'expiration par défaut, ou si vous souhaitez modifier le niveau d'isolation.
Aussi, chaque base de données ne sais pas à propos des exceptions - en interne démarrer une transaction pour chaque requête. C'est général considéré comme ne le fait pas pour la restauration des transactions lors de cette restauration n'est pas requise.
DBA peut être suivi de la restauration de l'activité, et de tout défaut comportement de restauration de les ennuyer dans ce cas.
Ainsi, les transactions sont utilisés de toute façon si vous commencez à eux ou pas. Si vous n'en avez pas besoin, ne commencez pas, mais ne jamais faire un rollback sur opérations en lecture seule.