我正在使用HttpContext.Current.Cache来缓存来自DB(.Net 4 Web应用程序)的数据。
我想确保不会遇到任何线程同步问题。
场景:指向同一公司对象的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
问题:
缓存是否提供任何类型的锁定?
我应该像ReaderWriterLockSlim一样添加锁定(具体如何)?
现有代码:
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:
用户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;
它会解决任何线程问题吗?
由于
答案 0 :(得分:1)
你无需担心。 class是线程安全的。
答案 1 :(得分:0)
如果您使用SQL来存储缓存,那么SQL将在写入时锁定行(在悲观模式下,这是默认模式),因此您不必担心这一点。事务不会提供线程安全性,但是在进行需要保持一致的更改时,无论如何都应该这样做。
您始终可以围绕任何“写入”方法添加锁定。
如果你想确保当任何用户调用“读取”方法时他们获得绝对最新的方法,那么也要锁定这些方法。