2012-11-15 6 views
11

Używam następujących transakcji deklaratywnej wiosennyJak uzyskać informacje o transakcji w Spring, czy transakcja została zatwierdzona czy wycofana w deklaratywnym zarządzaniu transakcjami?

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

Oto 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; 
    } 
} 

Chcę wiedzieć o transakcja transakcja tj stan jest zobowiązana lub wycofana. Potrzebuję go do logowania.

+1

Ta odpowiedź może być przydatny: [Wyświetlono Wiosna transakcyjnych w dzienniku] [1] [1]: http://stackoverflow.com/questions/1965454/showing-a-spring-transaction-in-log –

Odpowiedz

18

Jeśli transakcja jest w zakresie, można uzyskać TransactionStatus z TransactionAspectSupport.currentTransactionStatus(). Na przykład:

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

Ale to nie zadziała po zakończeniu transakcji.

Można dodać TransactionSynchronization i wdrożenie afterCompletion(int status) zalogować status lub przechowywać go w ThreadLocal zmiennej do późniejszego wykorzystania.

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

Dodanie następujących do log4j.properties umożliwią rejestrowanie statusu transakcji,

log4j.logger.org.hibernate.transaction=DEBUG,R 
log4j.logger.org.springframework.transaction=DEBUG,R 
Powiązane problemy