La Propagation du comportement de transaction
Je suis à l'aide de l'annotation basée approche déclarative pour le printemps de l'aop.
exemple de code
ClassA{
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
add()
{
method1();
method2();
method3();
}
}
Mais j'ai quand même un doute sur l'utilisation de la propagation.ne propagation.Requires_New signifie que chaque demande de commencer la nouvelle transaction.
Deuxième question:
Ne l'échec de la méthode, comme method2,method3 sera la cause de l'opération de restauration?
Je serai très heureux si quelque peut m'aider à s'appuie transaction propagation.
quelqu'un peut-il me fournir un exemple concret où nous avons besoin d'un participer à la transaction existante.parce que je visualise que l'ajout d'une fonction que l'on utilise dans l'exemple ci-dessus va être indépendant pour tous les utilisateurs,ou toute autre fonction qui sera indépendants pour chaque utilisateur qui appelle. Je ne suis pas en mesure de trouver des exemple où d'autres propagation d'un comportement comme PROPAGATION_SUPPORTS ,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW etc. sont utilisés
OriginalL'auteur Vish | 2011-04-05
Vous devez vous connecter pour publier un commentaire.
Répondre à ce commentaire, pas le libellé de la question:
Ni. demande de session et sont à la fois spécifiques au web étendues, tandis que le Printemps Opération d'abstraction n'a rien à voir avec les technologies du web.
Le champ d'application de
@Transactional
est par l'invocation de méthode, comme@Transactional
est mis en œuvre par Spring AOP. Le transactionnel de l'état est conservé dansThreadLocal
variables sont initialisées lors de la ultrapériphériques@Transactional
méthode est entré et effacé par commit ou rollback quand il est de gauche. Toute cette abstraction fonctionne sur Java au niveau de la méthode, et donc ne nécessite pas de ou de profit à partir d'un conteneur web.Et en réponse à cette Question dans le commentaire ci-dessous:
Voici la liste des
de Propagation de l'
valeurs avec mes commentaires:Ne pas démarrer une nouvelle Transaction, vérifie juste si une transaction est active (doit être à l'intérieur d'une autre
@Transactional
appel de méthode ou de l'un créé par programmation de la transaction)Démarrer une transaction imbriquée si une transaction existe, démarrer une nouvelle transaction autrement.
Ne pas démarrer une transaction. Échoue si une transaction est présent.
Ne pas démarrer une transaction. Suspend toute transaction existante.
Si une transaction existe, utilisez-le, sinon, créez-en un nouveau. Dans 95% des cas, c'est ce que vous avez besoin.
Toujours crée une nouvelle transaction, peu importe si une transaction existante est présent. Si il y a, il sera suspendu pour la durée de l'exécution de la méthode.
Peut utiliser une transaction si l'un est présent, mais n'en a pas besoin (et ne pas en commencer une nouvelle, soit)
Dans la plupart des cas,
REQUIRED
est ce que vous avez besoin (c'est la valeur par défaut dans la@Transactional
annotation). J'ai personnellement jamais vu de toute autre valeur, maisREQUIRED
etREQUIRES_NEW
en cours d'utilisation.Merci @Sean.donc, si la demande multiple en invoquant une même méthode de dire AJOUTER(),annotation REQUISE permettra de les faire exécuter dans la même transaction??.mais je pense que la méthode Add() de l'invocation seront indépendants les uns des autres en terme de transaction..il y a encore un peu de confusion
Non, jamais. Une nouvelle demande est toujours une nouvelle méthode d'invocation dans un nouveau thread et donc une nouvelle transaction. Tout cela transactionnelle de choses qui se passe au sein d'une invocation de méthode, de l'extérieur. Ce qui est difficile lorsque l'externe les appels de méthode intérieure de la méthode, mais l'appel de la méthode extérieure, deux fois deux opérations, que ce soit dans un contexte web ou pas.
+1 Merveilleuse explication. Pourriez-vous expliquer > Le transactionnel de l'état est conservé dans ThreadLocal variables sont initialisées lors de la ultrapériphériques @Transactional méthode est entré et effacé par commit ou rollback quand il est de gauche.
Patrick Floyd veuillez expliquer la différence entre la propagation JAMAIS et ne marque pas de méthode Transactionnelle à tous
OriginalL'auteur Sean Patrick Floyd
Transaction propagation indique quel doit être le comportement de la méthode donnée lorsqu'elle est invoquée.
REQUIRES_NEW
signifie qu'une nouvelle transaction doit toujours être démarré, même si il y a un cours de transaction.Si
method1()
, par exemple, définitREQUIRES_NEW
, qu'il va lancer dans une nouvelle transaction.Une exception restauration de l'actif en cours de transaction, oui.
OriginalL'auteur Bozho
Oui. Requires_New signifie que chaque demande de commencer la nouvelle transaction. et Oui l'échec dans method2,method3 sera la cause de l'opération de restauration, en fonction de la restauration de propriétés.
vérifier Transactionnelle propriétés.
OriginalL'auteur Manoj