Question

Je travaille avec une application web Grails et je reçois tellement de choses étranges lorsque vous utilisez un service Grails. Je veux donc poser quelques questions sur ce pour me faire comprendre plus sur les services Grails. Ce sera très utile pour moi (et peut-être pour d'autres ^ _ ^). Merci d'avance.

  1. Si un service est configuré avec transactionnelle statique = true, il va débusquer toutes les modifications de données à base de données après toute méthode avec un objet Invoke qui est sale et être verrouillé en session Hibernate?

  2. Puis-je utiliser l'annotation de @Transactional au niveau de la classe au lieu de static transactional = true? Et est-il possbile de mettre @Transactional(readOnly = true) à certaines méthodes que je veux simplement les données à lire (requête, trouver) de DB?

  3. Qu'en est-il de l'héritage de la transaction? Je veux dire que, si le service parent est configuré static transactional = true, et le service de l'enfant a son propre annotation @Transactional (la classe) et certains @Transactional(readOnly = true) (sur certaines méthodes), ce qui se passera si je l'appelle une méthode à des parents de celui des enfants?

  4. Est-ce que le travail transactionnel avec un service abstrait? Parce que je sais, avec un service abstrait nous ne pouvons pas initialisons son haricot, et peut-être quand l'application de départ, il y a quelques différences dans le contexte Grails.

Était-ce utile?

La solution

Vous devriez poser une question par question:)

Pour la question n ° 1, oui - l'intégration Spring / Hibernate garantit qu'une chasse d'eau se produit avant la commettre. Ainsi, les appels à save() et delete() auront rincée et il n'y a pas besoin d'ajouter flush: true soit. En outre, les instances sales que vous ne l'avez pas appelé save() sur également être rincées à moins que vous appelez discard().

Pour # 2: Les services sont transactionnels par défaut, donc transactional = true est en fait redondante - il vous suffit de le préciser à dire transactional = false. Mais l'emballage de transaction automatique qui est créé est faite que s'il n'y a pas d'annotations @Transactional. Si vous avez un ou plusieurs annotations puis les définir la démarcation des transactions. Donc, par défaut (à savoir pas annotations et non pas de propriété ou transactional transactional = true) toutes les méthodes sont transactionnelles, mais si vous annoter un sous-ensemble des méthodes alors que celles-ci seront transactionnelles.

Généralement, vous utilisez des annotations lorsque vous voulez le comportement par défaut, à savoir la propagation personnalisée, isolement, délai d'attente, etc. (ou ce qui en fait lecture seule comme dans votre exemple).

Vous pouvez annoter au niveau de la classe d'avoir la même configuration pour toutes les méthodes, et éventuellement annoter des méthodes individuelles pour remplacer les valeurs par défaut de classe étendue.

Pour # 3 et # 4, les règles standard sont applicables (voir # 2). Si la sous-classe contient des annotations, puis transactional = true de cette classe ou une classe parente serait ignorée depuis à l'aide d'annotations que vous avez dit Grails que vous configurez vous-même les choses.

Étant donné que les services abstraits ne peuvent être instanciés, la sous-classe concrète qui est en fait instancié aura un comportement combiné de la classe de base et elle-même. Si tout est transactional = true alors simple, voilà, et si vous avez des annotations, puis ils définissent les règles.

L'appel de méthodes dans la superclasse se comporterait comme appeler des méthodes dans la classe actuelle. Mais le comportement est un peu contre-intuitif si vous ne l'avez pas examiné les implications de l'approche proxy du printemps. Lorsque vous appelez une méthode transactionnelle, les intercepts proxy l'appel et rejoint la transaction active ou démarre un nouveau en cas de besoin, ou commence un nouveau si REQUIRES_NEW est spécifié. Mais une fois que vous êtes dans la vraie classe et appeler une autre méthode, vous aurez contourner le proxy. Donc, si vous appelez une autre méthode avec différents paramètres d'annotation, ils seront ignorés. Si vous allez faire, voir cette liste de diffusion de discussion pour ce qui se passe et comment travailler avec elle: http://grails.1312388.n4.nabble.com/non-transactional-service-extends-transactional-service-outcome-td3619420.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top