Spring 程式設計式事務 宣告式事務
阿新 • • 發佈:2018-11-10
程式設計式事務通用類:
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 註解,這將被忽略,也不會丟擲任何異常。