package com.mossle.core.hibernate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.TransactionStatus;
/**
* 考虑到TransactionManager中也可能因为业务进行手工回滚的情况 这种情况下不应该抛出异常
*
* 如果出现局部异常导致整体事务失败的情况,可以打开 org.springframework.transaction.interceptor.TransactionInterceptor的trace日志
* 就可以看到具体是因为什么异常导致的事务回滚
*
* 日志格式如下 "Completing transaction for [" + txInfo.getJoinpointIdentification() + "] after exception: " + ex);
*/
public class ReadOnlyTransactionManager implements PlatformTransactionManager {
/** logger. */
private static Logger logger = LoggerFactory
.getLogger(ReadOnlyTransactionManager.class);
private PlatformTransactionManager platformTransactionManager;
private boolean readOnly;
public TransactionStatus getTransaction(TransactionDefinition definition)
throws TransactionException {
if (readOnly) {
TransactionDefinition readOnlyTransactionDefinition = new ReadOnlyTransactionDefinition(
definition);
return platformTransactionManager
.getTransaction(readOnlyTransactionDefinition);
} else {
return platformTransactionManager.getTransaction(definition);
}
}
public void commit(TransactionStatus status) throws TransactionException {
platformTransactionManager.commit(status);
}
public void rollback(TransactionStatus status) throws TransactionException {
logger.info("transaction rollback at : {}", status);
platformTransactionManager.rollback(status);
}
public void setPlatformTransactionManager(
PlatformTransactionManager platformTransactionManager) {
this.platformTransactionManager = platformTransactionManager;
}
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
public boolean isReadOnly() {
return readOnly;
}
}