smayemba wrote:
Tout le monde (dans mon équipe ) s'étonnes qu'Hibernate ne fasse pas comme les CMP.
C'est pour ça qu'Hibernate marche et pas les CMP ;o)
Plus sérieusement, c'est pour ça que dans les EJB3.0, les CMP sont abandonnés pour une approche à la Hibernate. Il faut bien comprendre que les objets attachés à une session ne sont visibles que d'un seul thread contrairement aux CMPs, donc pas de besoin de synchronisation.
smayemba wrote:
A quel niveau dois-je agir pour synchroniser l'accès à mon module ? Je ne
vois pas non plus pourquoi j'ai ce problème ? Puisque ma transaction A
démarre avant ma transaction B. Je valide ma transaction A avant B mais
en dépit de ça, j'ai des StaleObjectException ???
Si je comprend bien,
le process A est lancé, il lit des données
le process B est lancé, il lit des données
le process A commite des changements
le process B commite des clangements
Tu as des exceptions parce que quand B essaie de commiter, elle utilise des données périmées puisque changées par A. Si ce scénario arrive rarement (et il devrait puisque le process ne devrait pas garder des connections à la DB trop longtemps), il faut laisser l'utilisateur résoudre le conflit ou le reprendre applicativement Si tu veux que le dernier ait toujours raison, il suffit de ne pas faire de gestion optimiste, la Tx B ecrasera la Tx A. Si tu veux que A finisse son travaille avant que B lise, tu doit poser un lock sur un objet commun (par exemple avec session.get(MaClasseCommune.class, id, LockMode.UPGRADE); )
A ce moment là, c'est ta base de données qui gère les locks mais cela scale moins.
Troisième solution, tu exécutes ton appel de service dans un block synchronize mais une seule personne à la fois peut accéder au service.
Ton isolation dépend de ton besoin et n'a rien à voir avec la technologie sous jacente.
smayemba wrote:
Je pense que la meilleur solution serait qu'une transaction B démarre
SEULEMENT apres que la transaction A ait été validée (commitée ses
modifications dans la base de données). Est-ce qu'Hibernate m'offre
un moyen de savoir qu'une transaction a été validée et que les
modifications ont été prises en compte par le SGBDR (Oracle 9i) ?
Non, et personne ne le peut à part Oracle DB. Quelqu'un pourrait accéder à ta base de données dans une autre application et contrecarrer les locks stockées en Java (tiens, je viens d'expliquer pourquoi les locks CMP n'étaient pas une bonne solution).
Mais la solution avec le bloc synchronisé est ce que tu viens de décrire.
Quote:
Dernière chose. Dans une application 'classique' comme la mienne
comment puis-je faire pour mettre en place un objet (genre mémoire
partagée) similaire au httpSession. Dans le bouquin d'Anthony et les
autres ils font appel au httpSession pour garder la session dans les
transactions longues. Ne voulant pas transformer mon application en
y mettant un EJB session qui puisse me faire ça, je cherche d'autres
solutions...
Une HashMap statique synchronisée.
Transaction longue == gestion des lock optimistes.