2011-09-27 115 views
0

我有關於在asp.net應用程序中管理事務的問題。在asp.net mvc應用程序中的實體框架和事務

例如我有計劃假期的申請。

控制器具有批准休假的窗體。

一個用戶 - 點擊保存並批准度假----要度假的員工 - 1天 第二個用戶 - clik保存並批准度假和?

//pseudocode 

    public void ApproveVacation(int vacationId) 
    { 
     //pull vacationdata from db 
     var vacation = _dbContext.Vacations.FirstOrDefault(x => x.Id == vacationId); 
     if (vacation != null && vacation.State != approved) // 
     { 
      using (TransactionScope scope = new TransactionScope()) 
      { 
       vacation.state = approved; 
       vacation.Employee.Days = -1; 
       _dbContext.saveChanges(); 
       scope.complete(); 
      } 
     } 
    } 

而問題很簡單,交易是否足夠用於這種情況,或者我必須使用一種協調技術?

謝謝

編輯:上下文創建一個請求。

回答

0

事務處理操作的原子性,因此如果操作修改多個數據庫記錄,它將始終導致所有記錄都被正確修改(如果操作成功)或所有更改回滾(如果操作失敗)的一致狀態。

併發處理由多個進程/用戶處理相同記錄的可能修改,因爲兩者都可以加載原始版本的記錄,但可以先保存它,這樣當第二個進程嘗試保存記錄時,它可以默默地覆蓋以前的更改。

那麼你想在你的代碼中處理什麼?

+0

那麼,我嘗試處理情況,當兩個或多個用戶點擊表單按鈕併發送請求批准度假(例如)。而且我只需要在第一個請求中更改vactaion狀態一次 – Mennion

+2

因此您需要併發機制 - 例如使用時間戳。 –

+0

好的,謝謝你的回答:) – Mennion

0

調用'SaveChanges'時已經有一個隱式事務,所以不需要事務作用域。

而且,如果您要更改多個項目,則需要在檢索數據之前啓動TransactionScope