Y a-t-il des impacts négatifs lorsqu'une seule application utilisateur utilise une seule transaction IB, qui est active tant que le programme s'exécute? En utilisant uniquement CommitRetaining et RollbackRetaining. Contexte: Je souhaite utiliser IBQuery (s) et les connecter à un (des) DB Grid (s) (DevExpress), qui charge tous les enregistrements en même temps dans la mémoire. Je veux donc éviter de ré-extraire toutes les données après chaque commande d'insertion SQL. IBTransaction.Commit fermerait l'ensemble de données.Une transaction IB active toute la durée de vie d'une seule application utilisateur
Répondre
Il me semble que vous essayez d'utiliser une fonctionnalité de base de données afin d'éviter d'utiliser TClientDataSet
, ce qui est clairement la meilleure façon de travailler dans Delphi ces jours-ci. Pourquoi faire des pieds et des mains et utiliser des pratiques de transactions douteuses au lieu de suivre le modèle plus commun pour l'utilisation des composants de base de données, qui est déjà une meilleure solution au problème actuel? CommitRetaining et RollbackRetaining ne sont pas bons.
Vous avez en quelque sorte raison :) Je pense déjà depuis longtemps, de quelle façon j'irai. En utilisant directement TIBQuery ou TClientDataset. IBQuery possède de jolies fonctionnalités de conception (par exemple SQLUpdate), ce qui facilite considérablement le développement de RAD. J'ai également un peu de souci, si une couche supplémentaire pourrait introduire plus de problèmes, rend le développement plus compliqué et réduire les performances. En fait, je ne suis pas sûr de la meilleure approche pour une application utilisateur unique. Avez-vous des lignes directrices? –
Il ne fait aucun doute que c'est, au moins à un niveau superficiel, plus compliqué d'utiliser 'TClientDataSet' pour ne pas l'utiliser. Cependant, une fois que vous apprenez à l'utiliser, vous pouvez utiliser ces compétences pour résoudre une grande variété de problèmes que vous ne pouvez pas résoudre sans lui (ou sans un autre composant qui fait ce qu'il fait). J'utilise 'TClientDataSet' pour chaque application de base de données Delphi que j'écris, y compris mes outils gratuits d'analyse de performance IB. –
merci pour votre information –
transaction doit être très courte.
Pourriez-vous élaborer, s'il vous plaît? Pourquoi les méthodes XRetaining sont-elles mauvaises? Pourquoi les transactions doivent-elles être courtes? Combien doivent-ils être courts? –
Cela était vrai avec les versions archaïques de IB, mais ce n'est plus vrai avec les versions actuelles sauf si vous utilisez l'isolation de capture instantanée. Rob, si vous utilisez l'isolation de snapshots, le serveur doit conserver les anciennes versions d'enregistrement, ce qui empêche le ramasse-miettes du serveur IB de fonctionner, ce qui signifie que chaque SELECT doit parcourir de nombreuses versions d'enregistrement pour trouver celle qui est visible à la transaction de l'utilisateur. Cela est vrai même si la transaction en cours n'est pas un instantané. Dans les anciennes versions de IB, même les transactions non-snapshot pouvaient interférer avec le garbage collection. Cela a été corrigé il y a des années –
@Craig: Savez-vous si cela est également vrai pour Firebird? – jachguate
Quelle version d'Interbase? –
J'utilise Firebird 2.0 –