2012-03-31 2 views
0

Je travaille sur un projet qui a des services Web basés sur Spring et une persistance basée sur Spring Jdbc. J'ai configuré un DataSourceTransactionManager pour gérer les transactions et l'ai appliqué à la couche de service en utilisant un pointcut. Le niveau de propagation de transaction est défini sur REQUIRED.Comment gérer la concurrence des transactions de manière déclarative?

Les requêtes sont émises via Spring fourni JdbcTemplate. Le problème est qu'en cas de requête simultanée multiple à un service, j'obtiens une exception MySQLTransactionRollbackException ("Deadlock trouvé en essayant de verrouiller, essayez de redémarrer la transaction").

Apparemment, l'une des transactions a obtenu un verrou qui fait échouer le second.

Ma question est - Comment configurer Spring pour retarder l'exécution du service jusqu'à ce qu'un verrou soit disponible, au lieu de simplement abandonner et lancer une exception?

Je ne parviens même pas à attraper l'exception et j'essaie de réexécuter la requête car j'ai appliqué la transaction sur la couche de service comme un conseil en gardant mes DAO propres.

J'espère obtenir une solution déclarative seulement (puisque je suis un fanatique AOP & croisé contre le code :-)). Mais même les solutions programmatiques sont les bienvenues.

Merci pour vos suggestions.

Mise à jour -

@ninjalj Oui, il était en fait une véritable impasse. Il s'avère que j'écrivais mon scénario de test incorrectement. Idiot me :-(

Répondre

0

Si je ne me trompe pas, qui indique une véritable impasse, alors vous devriez vraiment recommencer l'opération. IIRC, un délai d'attente en attente d'un verrou a « délai d'attente » dans le message d'exception.

Questions connexes