2012-11-15 7 views
11

I deklarative Frühling Transaktion folgende benutzen:Wie erhalte ich Transaktionsinformationen in Spring, ob Transaktion Commit oder Rollback in einem deklarativen Transaktionsmanagement ist?

<!-- 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"/> 

Hier ist die 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; 
    } 
} 

ich über Transaktionsstatus d.h Transaktion wissen wollen, hat sich verpflichtet oder zurückgerollt. Ich brauche es zum Loggen.

+1

Diese Antwort nützlich sein könnte: [eine Feder Transaktion in Log-Anzeigen] [1] [1]: http://stackoverflow.com/questions/1965454/showing-a-spring-transaction-in-log –

Antwort

18

Wenn Transaktion im Bereich ist, können Sie TransactionStatus von TransactionAspectSupport.currentTransactionStatus() erhalten. Zum Beispiel:

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

Aber dies wird nicht funktionieren, nachdem die Transaktion abgeschlossen ist.

Sie könnten TransactionSynchronization hinzufügen und afterCompletion(int status) implementieren, um den Status zu protokollieren oder in einer ThreadLocal Variablen für die spätere Verwendung zu speichern.

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

Folgendes Ihre log4j.properties Das Hinzufügen Transaktionsstatusprotokollierung aktivieren,

log4j.logger.org.hibernate.transaction=DEBUG,R 
log4j.logger.org.springframework.transaction=DEBUG,R 
Verwandte Themen