2010-09-07 4 views
7

Il y a eu plusieurs messages d'enregistrement de l'activité (démarrage, validation & rollback) du gestionnaire de transactions de Spring. Cependant, je suis récemment tombé sur un problème d'interblocage pour lequel la journalisation de l'activité n'est pas suffisante.Comment enregistrer le contenu d'une transaction Spring

Le problème fondamental dans notre code est une utilisation désordonnée des propagations de transaction REQUIRED et REQUIRES_NEW. Il y a tellement d'appels de méthodes que nous nous retrouvons avec beaucoup de transactions empilées les unes sur les autres. Hélas, la base de code est énorme et la solution urgente ... (Nous savons tous ce que c'est.)

Le problème était un blocage parce que le code a été ajouté à des requêtes d'entités dans une transaction qui ont été sous-séquentiellement modifiées dans un autre transaction. Spring crache une exception indiquant que la mise à jour de l'entité X expire parce qu'elle est verrouillée. Maintenant, sachant que c'est bien, mais comment trouver le code défectueux: La requête qui fait le verrouillage précoce.

Ma question (enfin): Existe-t-il un moyen de consigner les entités ajoutées à une transaction? De cette façon, je peux spécifiquement rechercher des transactions bloquant l'entité dont se plaint Spring.

Merci! :-)

Répondre

0

Essayez d'enregistrer les requêtes dans votre ORM. Peut être que ce sera plus facile de trouver une "mauvaise" transaction.

1

Printemps des délégués à un gestionnaire de transactions, donc Spring ne sait pas quelles entités sont touchées dans la transaction, le gestionnaire de transactions fait. Comme l'a dit Donz, regarder le gestionnaire des transactions pour l'information est la meilleure approche d'investigation.

Vous pouvez également parcourir toutes les définitions de transaction et supprimer REQUIRES_NEW de tout sauf écrire uniquement/écrire toujours méthodes de type (comme l'audit ou la journalisation). Si vous avez REQUIRES_NEW dans votre logique métier principale, c'est un bug ou un design très étrange. Le supprimer aveuglément pourrait avoir moins d'effets secondaires que vous ne le pensez.

Questions connexes