Как получить информацию о транзакции в Spring, совершена ли транзакция или откат в декларативном управлении транзакциями?
Я использую следующую декларативную транзакцию Spring:
<!-- 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"/>
Вот 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;
}
}
Я хочу знать о состоянии транзакции. i.e транзакция совершена или откат. Мне нужно это для ведения журнала.
Ответы
Ответ 1
Если транзакция находится в области видимости, вы можете получить TransactionStatus
от TransactionAspectSupport.currentTransactionStatus()
. Например:
if (TransactionSynchronizationManager.isActualTransactionActive()) {
TransactionStatus status = TransactionAspectSupport.currentTransactionStatus();
...
}
Но это не будет работать после завершения транзакции.
Вы можете добавить TransactionSynchronization
и реализовать afterCompletion(int status)
для регистрации состояния или сохранения его в переменной ThreadLocal
для последующего использования.
public class LogTransactionSynchronization extends TransactionSynchronizationAdapter {
@Override
public afterCompletion(int status) {
// log the status or store it for later usage
}
}
Ответ 2
Добавление следующего к вашему log4j.properties будет включать ведение журнала транзакций,
log4j.logger.org.hibernate.transaction=DEBUG,R
log4j.logger.org.springframework.transaction=DEBUG,R