當前位置:編程學習大全網 - 源碼下載 - 關於Spring事務控制方面的問題,就是不在service層做控制

關於Spring事務控制方面的問題,就是不在service層做控制

同意1樓的兄弟說的,業務邏輯應該由service處理,造成需要在action開啟事務的最根本原因主要是妳的組件層API設計有問題,action中不該處理業務邏輯代碼的,需要調多個service完成的功能其實就是壹個業務,不過不按1樓說的把action放到spring托管也有辦法在action手動開啟事務,下邊是我以前寫的代碼,當時是為了解決遺留系統的事務問題,妳可以參考測試壹下:

public interface ITransactionManager {

/**

* 該方法中是需要進行事務控制的內容

* @return

* @throws Exception

*/

Object doInTransaction() throws Exception;

}

public class DataSourceTransactionUtil {

public Object execute(final ITransactionManager transactionManager){

DataSourceTransactionManager dataSourceTransactionManager = getDataSourceTransactionManager();

TransactionTemplate transactionTemplate = new TransactionTemplate(dataSourceTransactionManager);

return transactionTemplate.execute(new TransactionCallback(){

public Object doInTransaction(TransactionStatus transactionStatus) {

Object savepoint = transactionStatus.createSavepoint();

Object result = null;

try{

result = transactionManager.doInTransaction();

} catch(Exception e){

transactionStatus.rollbackToSavepoint(savepoint);

e.printStackTrace();

} finally{

transactionStatus.releaseSavepoint(savepoint);

}

return result;

}

});

}

private DataSourceTransactionManager getDataSourceTransactionManager(){

return (DataSourceTransactionManager)getBean("transactionManager");

}

}

解釋壹下:

這段代碼我記得是看了spring源碼後自己寫的。

1、getBean("transactionManager");是獲得spring中事務管理器那個bean,妳自己改名字。

2、把這段代碼放到妳的BaseAction中:

protected Object beginTransaction(ITransactionManager transactionManagerImpl){

DataSourceTransactionUtil dt = new DataSourceTransactionUtil();

return dt.execute(transactionManagerImpl);

}

3.在妳需要開啟事務的action中調用beginTransaction方法transactionManagerImpl這個對象妳寫個匿名內部類然後實現doInTransaction() 方法,在doInTransaction() 中去寫妳調用多個service的代碼

  • 上一篇:剛開始學習 iOS 開發有什麽書推薦呢?
  • 下一篇:怎麽看上升星座查詢表個人星盤查詢
  • copyright 2024編程學習大全網