java/alibaba/bulbasaur/persist/src/main/java/com/tmall/pokemon/bulbasaur/persist/PersistHelper.java

PersistHelper.java
package com.tmall.pokemon.bulbasaur.persist;

import java.lang.reflect.UndeclaredThrowableException;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import com.tmall.pokemon.bulbasaur.persist.tx.TransactionRun;

/**
 * 注入SqlMapClient,初始化DAO
 * 
 * @author [email protected]
 * @since 2012-12-18 上午10:16:25
 * 
 */
public clast PersistHelper {
	private final static Logger logger = LoggerFactory.getLogger(PersistHelper.clast);

	private static PlatformTransactionManager transactionManager;

	@PostConstruct
	protected void init() {
		transactionManager = new DataSourceTransactionManager(PersistModule.getInstance().getDataSource());
	}

	private TransactionStatus getTransactionStatus() {
		DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
		definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		definition.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);
		return transactionManager.getTransaction(definition);
	}

	public  T tx(TransactionRun run) {
		TransactionStatus txStatus = getTransactionStatus();
		T result;
		try {
			result = run.run();
		} catch (RuntimeException re) {
			transactionManager.rollback(txStatus);
			throw re;
		} catch (Error err) {
			transactionManager.rollback(txStatus);
			throw err;
		} catch (Exception e) {
			transactionManager.rollback(txStatus);
			throw new UndeclaredThrowableException(e, "undeclared error happened in transaction");
		}
		transactionManager.commit(txStatus);
		return result;
	}

	public static PlatformTransactionManager getTransactionManager() {
		return transactionManager;
	}

}