Index: topia2/doc/Isolation.rst diff -u /dev/null topia2/doc/Isolation.rst:1.1 --- /dev/null Mon Jan 23 13:51:57 2006 +++ topia2/doc/Isolation.rst Mon Jan 23 13:51:52 2006 @@ -0,0 +1,67 @@ +=========================== +Isolation des TopiaContexts +=========================== + +remarque: les requetes ne sont pas bonne, mais sont la pour donner l'idée +générale. + +Pour mettre en place l'isolation entre les différents TopiaContexts créé par +begionTransaction, il faut ajouter un nouvelle propriété sur les +TopiaEntity: TopiaContextId. Cette propriété prend la valeur de l'id du +TopiaContext qui a créé ou chargé l'objet. On voit donc que plusieurs objet +ayant le même id peuvent exister, le TopiaContextId doit donc faire partie +de la cle de l'objet. Il faut aussi ajouter un champs TopiaDeleted pour +savoir si un objet a ete effacé ou non. + +Dans le mapping hibernate pour chaque class d'entité, on a un filtre: +where TopiaContextId == :id || (TopiaContextId > 0 && TopiaContextId <= :id) + +Ce filtre n'est pas suffisant car on a toutes les versions commités de +l'objet jusqu'a :id, il faut un autre filtre apres les recherches pour +n'avoir que les dernieres versions des entites et supprimé dans ce groupe +les entites marquées effacées. +where TopiaContextId = max(TopiaContextId) && isDeleted=false group by topiaId + +Lors d'un beginTransaction le nouveau TopiaContext active ce filtre pour son +propre id. + +De cette manière un TopiaContext ne voit que les objets qu'il a cree et/ou +modifié ou les objets plus ancien que lui. + +Cette Id est: - System.nanoTime() et donc toujours négatif. + +Lors d'un commit d'un TopiaContext, on passe tous les TopiaContextId de +toutes les entités qui sont egal a l'id du TopiaContext en sa version +positive: update set TopiaContextId = -:id where TopiaContextId = :id +De plus le TopiaContext renouvelle sont id et modifie tous les filtres pour +qu'il est la vision d'objet créé par d'autre TopiaContext avant son commit + +Lors d'un rollback il suffit de faire le renouvellement de l'id et la mise a +jour des filtres. + +Sous transaction +================ + +La gestion des TopiaContextId pourrait offrire les sous-transactions, si +dans le filtre on ajoutait comme condition au lieu de TopiaContextId == :id +TopiaContextId in (:idList) ou idList serait la liste des ids du +TopiaContext courant ainsi que des TopiaContext parent. + +Historisation +============= + +La gestion des TopiaContextId permet d'offire l'historisation de tous les +objets. Car tous les objets commités sont conservés avec un TopiaContextId +différent pour chaque version. + +Implantation +============ + +- Mettre en place les champs supplémentaires: TopiaContextId, TopiaDeleted +- Modifier la cle primaire pour ajouter TopiaContextId +- Ajouter les filtres dans les mappings +- Ajouter un id sur les TopiaContext +- Modifier le comportement de DAO.delete pour qu'il marque juste l'objet + comme effacé sans l'effacer TopiaDeleted=true +- Pour toutes les recherches ajouter un filtre pour ne retourner que les + derniere version non deleted