2010-03-04 5 views
1

J'espérais que quelqu'un pourrait confirmer ma compréhension du comportement des transactions dans un service de printemps. Premièrement, ai-je raison de croire que lorsque vous utilisez TransactionManager, tous les services qui entraînent la persistance dans la base de données doivent être invoqués depuis une méthode @Transactional pour que la mise à jour persiste dans la base de données?Est-ce que je comprends correctement le comportement de Spring @Transactional?

Par exemple, étant donné la classe suivante:

class MyService 
{ 
    CustomerImporter customerImporter 
    CustomerDAO customerDAO 

    public void updateCustomer(Customer customer) 
    { 
     customerDAO.update(customer) 
    } 

    public List<Customer> importCustomers(String url) 
    { 
     customerImporter.importCustomers(url); 
    } 
    return customerDAO.getFromURL(url); 
} 

Si updateCustomer n'est pas @Transactional, sera la méthode a un effet?

En outre, si sur CustomerImporter la méthode importCustomers() est marquée @Transactional mais MyService ne l'est pas, la mise à jour sera-t-elle conservée dans la base de données?

Répondre

2

Oui, vous avez raison - vous avez besoin de @Transactional + <tx:annotation-driven /> pour que les transactions fonctionnent.

Une autre méthode consiste à utiliser les capacités <aop: du ressort dans le fichier xml. En ce qui concerne votre deuxième question, elle sera exécutée dans la même transaction. Jetez un oeil à transaction propagation pour savoir comment ce comportement est défini sur les méthodes transactionnelles.

4

Tout d'abord, je raison de croire que Lorsque vous utilisez TransactionManager, tous les services qui se traduisent par la persistance à la base de données doit être invoquée à partir d'une méthode @Transactional pour que la mise à jour à obstinent le db?

Ce n'est pas le cas, non. Sans l'annotation, les mises à jour de la base de données seront effectuées de manière non transactionnelle, mais elles se produiront toujours.

Si updateCustomer n'est pas @Transactional, sera la méthode ont un effet?

De plus, si le CustomerImporter la méthode ImportCustomers() est marquée @Transactional mais MyService n'est pas, sera la mise à jour persistée à la base de données ?

En fait, il n'y a pas d'association magique entre @Transactional et le DAO. L'annotation définit une limite de transaction et Spring démarrera/annulera/validera la transaction chaque fois qu'une méthode @Transactional -annotée est entrée ou quittée. Si vous exécutez une méthode sans @Transactional et que cette méthode appelle une autre méthode dans une autre classe, et qu'une autre en appelle une autre, ce qui finit par fonctionner, vous êtes toujours dans la transaction. Les annotations peuvent aller où bon vous semble. Par exemple, vous pouvez mettre @Transactional sur vos contrôleurs MVC si vous le souhaitez, cela fonctionnera tout de même, vous ne faites que déplacer la limite de transaction vers le haut.

Questions connexes