1. 程式人生 > >Spring 程式設計式事務 宣告式事務

Spring 程式設計式事務 宣告式事務

程式設計式事務通用類:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

/**
 * 程式設計式事務
 * @author Administrator
 *
 */
@Component
public class TransactionUtils {
	
	private static DataSourceTransactionManager txManager;
	
	@Autowired
	public void setTxManager(DataSourceTransactionManager txManager) {
		TransactionUtils.txManager = txManager;
	}
	
	public static TransactionStatus beginTrans() {
		DefaultTransactionDefinition def = new DefaultTransactionDefinition();
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔離級別,開啟新事務
		return txManager.getTransaction(def); // 獲得事務狀態
	}
	
	public static void commit(TransactionStatus status) {
		txManager.commit(status);
	}
	
	public static void rollback(TransactionStatus status) {
		txManager.rollback(status);
	}
}


呼叫方式:

	public static void main (String[] args){
		TransactionStatus transactionStatus = null;
		boolean isUpdateSuccess = true;
		try {
			transactionStatus = TransactionUtils.beginTrans(); //獲取事務
			if (isUpdateSuccess) {
				TransactionUtils.commit(transactionStatus);//事務提交
			} else {
				TransactionUtils.rollback(transactionStatus);//事務回滾
			}
		} catch (Exception e) {
			TransactionUtils.rollback(transactionStatus);//事務回滾
			e.printStackTrace();
		}
	}

宣告式事務:

只需在方法上加上@Transactional註解

@Transactional 可以作用於介面、介面方法、類以及類方法上。當作用於類上時,該類的所有 public 方法將都具有該型別的事務屬性,同時,我們也可以在方法級別使用該註解來覆蓋類級別的定義。

雖然 @Transactional 註解可以作用於介面、介面方法、類以及類方法上,但是 Spring 建議不要在介面或者介面方法上使用該註解,因為這隻有在使用基於介面的代理時它才會生效。另外, @Transactional 註解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者預設可見性的方法上使用 @Transactional 註解,這將被忽略,也不會丟擲任何異常。