mon application conatians hibernate et spring frameworks, sur le serveur tamcat et mysql. J'ai annoté une fonction comme transactionnelle, et j'ai vu qu'elle ne se comporte pas comme une méthode transacitonale (par exemple, je peux voir les changements dans le DB dans le navigateur de requêtes, avant que la fonction se termine).transactions dans les haricots de printemps
la méthode est exécutée à partir d'un haricot, mais dans différents fil, comme ceci:
executor.submit(new Runnable(){
@Override
public void run() {
someSpringService.doDbStuff();
}
});
intérieur doDbStuff, je fais appel à plusieurs méthodes, et chaque méthode en utilisant le modèle, comme ceci:
Parfois, je exeuctue également dans la requête SQL native HiberateCallback, en utilisant la session que je reçois en tant qu'argument de doInHiberate. Mes questions sont les suivantes: 1. L'annotation transactionnelle est-elle ignorée parce que j'utilise un fil différent? 2. comment puis-je exécuter la fonction qui est annotée avec l'annotation transactionnelle comme un haricot de printemps (et non comme une fonction régulière - peut-être cela va résoudre 1)? 3. Si je crée plusieurs HibernateCallback dans une callstack contenant une annotation transactionnelle, est-ce que cela se comporte comme une méthode transactionnelle? dois-je utiliser la même session, et la passer entre les fonctions internes?
... merci
J'ai vérifié TransactionSynchronizationManager.isActualTransactionActive(), et comme je le pensais - il a renvoyé false. Je suppose que le problème est que j'exécute le haricot de printemps comme une fonction régulière, à partir d'un fil différent (la callstack de la fonction annotée transactionnelle ne contient pas de classes de printemps ...). savez-vous comment exécuter la fonction en tant que haricot normal? – yonatan
BTW - si j'utilise hibrtnateTemplate.beginSession(). StartTransaction() et le commet à la fin de la fonction - encore, les fonctions internes ne reconnaissent pas la transaction. – yonatan
Comment obtenez-vous 'someSpringService'? Essayez d'exécuter 'someSpringService.doDbStuff();' avant 'executor.submit()' (dans le même thread). Est-ce que ça marche alors? Si oui, cela mérite une deuxième question. –