2012-11-15 2 views
11

J'utilise la suite déclarative transaction Spring:Comment obtenir des informations de transaction au printemps, que la transaction soit validée ou annulée dans une gestion de transaction déclarative?

<!-- Declare a transaction manager--> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory" /> 
<!-- enable the configuration of transactional behavior based on annotations --> 
    <tx:annotation-driven transaction-manager="transactionManager" mode="proxy" proxy-target-class="true"/> 

Voici le DAO:

@Repository 
@Transactional(readOnly = true, propagation=Propagation.REQUIRES_NEW) 
@Scope("prototype") 
public class Xdao{ 

    public Object getValues(){ 
     ..... 
    } 
} 


@Service 
@Scope("prototype") 
public class Xservice{ 
private Xdao xdao; 

    public Object getx(){ 
     xdao.getValues();//here I want to know whether the transaction started is    
     //committed or rollback by aop. Is it possible somehow? I don't want to include that code 
     //in any service or dao layer. 
     ......... 
    } 

    @Autowired 
    public void setXdao(Xdao xdao){ 
     this.xdao=xdao; 
    } 
} 

Je veux savoir sur l'état de transaction transaction i.e. est validée ou annulée. J'en ai besoin pour la journalisation.

+1

Cette réponse pourrait être à portée de main: [Afficher une opération de printemps dans le journal] [1] [1]: http://stackoverflow.com/questions/1965454/showing-a-spring-transaction-in-log –

Répondre

18

Si la transaction est dans la portée, vous pouvez obtenir TransactionStatus à partir de TransactionAspectSupport.currentTransactionStatus(). Par exemple:

if (TransactionSynchronizationManager.isActualTransactionActive()) { 
    TransactionStatus status = TransactionAspectSupport.currentTransactionStatus(); 
    ... 
} 

Mais cela ne fonctionnera pas après la transaction est terminée.

Vous pouvez ajouter un TransactionSynchronization et implémenter afterCompletion(int status) pour consigner l'état ou le stocker dans une variable ThreadLocal pour une utilisation ultérieure.

public class LogTransactionSynchronization extends TransactionSynchronizationAdapter { 
    @Override 
    public afterCompletion(int status) { 
     // log the status or store it for later usage 
    } 
} 
3

Ajouter ce qui suit à vos log4j.properties permettront l'enregistrement d'état de transaction,

log4j.logger.org.hibernate.transaction=DEBUG,R 
log4j.logger.org.springframework.transaction=DEBUG,R 
Questions connexes