2011-02-23 20 views
3

我正在使用HttpContext.Current.Cache來緩存來自數據庫(.Net 4 Web應用程序)的數據。使用.Net Cache時,我應該添加Locks還是TransactionScope?

我想確保我不會遇到任何線程同步問題。

場景:3級的用戶指向同一公司對象:

用戶A:

Profile.Company.Name = 「CompX」; 
Profile.Company.Desc = 「CompXDesc」; 
Profile.Company.Update(); //Update DB 

用戶B:

String Name = Profile.Company.Name; 

用戶C:

Profile.Company.Name = 「CompY」; 
Profile.Company.Update(); //Update DB 

Q問題:

  1. 緩存是否提供任何類型的鎖定?

  2. 我應該像ReaderWriterLockSlim一樣添加Lock嗎?

現有代碼:

ProfileBLL: 
public CompanyBLL Company { 
     get  { 
       return CompanyBLL.GetById(this.Company_ID); 
     } 
    } 

// HttpContext.Current.Cache 
public static CompanyBLL GetById(int Company_ID) { 
     string key = "GetById_" + Company_ID.ToString(); 
     CompanyBLL ret = null; 
     if (Cache[key] != null) { 
      ret = (CompanyBLL)Cache[key]; 
     } 
     else 
     { 
      ret = DAL_Company<CompanyBLL>.GetById(Company_ID); 
      Cache[key] = ret; 
     } 
     return ret; 
} 

另一種選擇是增加的TransactionScope上任何DB更新:

用戶A:

using (TransactionScope Scope = new TransactionScope()){ 
Profile.Company.Name = 「CompX」; 
Profile.Company.Desc = 「CompXDesc」; 
Profile.Company.Update(); //Update DB 
Scope.Complete(); //COMMIT TRANS 
} 

用戶B:

String Name = Profile.Company.Name; 

它能解決任何線程問題嗎?

感謝

回答

1

你沒什麼好擔心的。 class是線程安全的。

0

如果你使用SQL存儲緩存則SQL會鎖住,因爲它是被寫入該行(下悲觀的模式,這是默認的),所以你不會擔心這一點。事務不會提供線程安全性,但在進行需要保持一致的更改時,無論如何您都應該這樣做。

您可以隨時添加任何「寫入」方法的鎖定。

如果你想確保當任何用戶調用一個「讀取」方法,他們獲得最新的絕對然後鎖定這些方法以及。

相關問題