2011-06-04 79 views
2

我有一個asp.net mvc 3網站,當某人編輯任務時,它鎖定該任務,以便他們可以對其進行編輯並確保其他訂閱者在編輯任務時不刪除或更新任務。嘗試抓住最後的聲明?

他們點擊任務上的編輯,它會去抓住任務並鎖定它。他們編輯任務並更新。

現在我有這樣的事情

public Task Update(Task task) 
{ 
    isLocked = true; 
    try 
    { 
     // set task to unlock itself(this is stored on the task row in the db) 
     task.locked = false 
     task.DateLocked = "6/3/1900"; 
     task.Commit(); // save the newly updated task; - nhibernate 

     isLocked = false; 
     return task 
    } 
    catch(SqlException ex) 
    { 
     // error logging here 
     // "database is down error to user" 
    } 
    finally 
    { 
     if(isLocked) 
     { 
      task.locked = false 
      task.DateLocked = "6/3/1900"; 
      task.Commit(); 
     } 
    } 
} 

如果任務被成功更新文件被解鎖,所以我不會在最後再次打擾做。如果我遇到一些像空引用這樣的意外錯誤(非常不可能,因爲我檢查了可能爲空的任何內容並導致異常,但讓我們假裝它會以某種方式發生)。

我最後的聲明會啓動,並確保當然解鎖網站的文件會炸燬,用戶會得到一些通用的「出錯的錯誤」,但該文件將被解鎖,以便他們可以再試一次。

現在如果錯誤是SqlException錯誤會發生什麼?它會被抓住,但最後的聲明仍然會運行,它也會在那裏炸燬。

我應該在另一個try catch中封裝我的finally塊中的代碼嗎?

我確實有一個計劃任務,每隔一段時間運行一次,以確保任務最終將被解鎖,因此如果它像數據庫關閉一樣,它不像任務被永久鎖定,它最終應該被解鎖。

+0

你不需要僞裝,異常就莫名其妙地發生了:d – TheVillageIdiot 2011-06-04 04:44:18

回答

2

從你的情況似乎並不越來越最後再次運行提交語句很有好處。你可以做這樣的事情來處理數據庫唯一的例外是這樣的:

public Task Update(Task task) 
{ 
    isLocked = true; 
    try 
    { 
     //DO OTHER STUFF HERE 
    } 
    catch(Exception ex) 
    { 
     // error logging here 
    } 
    finally 
    { 
     UpdateToDB(task) 
    } 
    return task; 
} 

private Task UpdateToDB(Task task) 
{ 
    try 
    { 
     task.locked = false 
     task.DateLocked = "6/3/1900"; 
     task.Commit();  
    } 
    catch(Exception e) 
    { 
     //LOG ERROR 
    } 
    catch(SqlException ex) 
    { 
     //LOG ERROR 
     // "database is down error to user" 
    } 
    isLocked = false; 
    return task 
} 
+0

那麼原因是我有幾個如果發言。一個檢查用戶是否存在,一個檢查他們是否獲得了實際編輯任務的權限(當任務首次加載時,我檢查他們是否可以編輯任務,但是沒有人試圖直接轉到更新方法)。所以這就是爲什麼我做了兩次。即使可能並不總是需要,最後也是一種盲解。 – chobo2 2011-06-04 05:01:49

0

你有沒有考慮簡單地設置一個標誌,以表明被抓SQLException的,並在finally塊,檢查該標誌,並隨後採取適當行動......

+0

是的,我有,但希望更好的方式則標誌。 – chobo2 2011-06-05 21:03:41