Fonctionnement des datasets en mode cachedUpdates avec
delphi2 + Oracle


Avec des datasets en mode cached updates, pour effectuer une sauvegarde des données
dans la base, on pourrait donner l’ordre suivant des opérations :

Try

  • Ouvrir transaction (TDatabase.openTransaction)
  • Edit -> CachedUpdates -> base Oracle (Tdataset.ApplyUpdates)
  • Commit (Tdatabase.Commit)
  • Mettre a jour les cachedUpdates (Tdataset.CommitUpdates)
    Except
  • Rollback (Tdatabase.Rollback)
  • Si effacement données que l’on voulait poster alors
  • Effacer les cachedUpdates(Tdataset.CancelUpdates)
  • Sinon
  • Rien
    Fin

    Explication du fonctionnement ' constaté ' des datasets en mode cacheUpdates :

    On pourrait modéliser une dataset a l’aide d’un tableau, ainsi a la suite d’un select sur une table
    On pourrait se retrouver avec l’exemple suivant en mémoire :

    Un post envoie les modifications (insertion, modification, suppression) du record courant dans le cache. La
    dataset ne sachant référencer qu’un seul record a la fois, toutes les méthodes de déplacement (next, prior,
    last..)lancent un post implicite. L’un des intérêts des caches est donc de faire plusieurs modifications en mémoire
    sans les envoyer systématiquement à la base.

    Si par exemple on modifie B en Bnew, on insere DA après D, on efface C et que l’on est en train d’insérer F (on
    ne l’a pas encore posté), on se retrouve avec le schéma suivant :

    Un cancel travail sur l’enregistrement courant et l’annule simplement :

    Un applyUpdates envoie dans la base les modifications, mais garde la dataset intacte (toutefois, si le record
    courant n’a pas été posté au moment du applyUpdates, il est posté par défaut) :

    Un commit envoie les modifications ‘sur le disque’ tandis que le rollBack les annule, mais pour les caches en
    mémoire, ces deux opérations n’ont aucune incidence, ce qui permet de récupérer les données lors d’une erreur
    (par exemple un contrôle d’intégrité) :

    C’est le commitUpdates qu’il faut appeler pour mettre a jour la dataSet en mémoire, si la transaction a bien
    fonctionné :

    Tandis que le cancelUpdates permet de retrouver l’état initiale (lors d’une erreur au commit par exemple) :

    Quelques remarques :