我应该在使用.Net Cache时添加Locks还是TransactionScope?

时间:2011-02-23 13:50:53

标签: c# .net caching transactions locking

我正在使用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

问题:

  1. 缓存是否提供任何类型的锁定?

  2. 我应该像ReaderWriterLockSlim一样添加锁定(具体如何)?

  3. 现有代码:

    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;
    

    它会解决任何线程问题吗?

    由于

2 个答案:

答案 0 :(得分:1)

你无需担心。 class是线程安全的。

答案 1 :(得分:0)

如果您使用SQL来存储缓存,那么SQL将在写入时锁定行(在悲观模式下,这是默认模式),因此您不必担心这一点。事务不会提供线程安全性,但是在进行需要保持一致的更改时,无论如何都应该这样做。

您始终可以围绕任何“写入”方法添加锁定。

如果你想确保当任何用户调用“读取”方法时他们获得绝对最新的方法,那么也要锁定这些方法。