【问题标题】:Should I add Locks or TransactionScope when using .Net Cache?使用 .Net Cache 时应该添加锁还是 TransactionScope?
【发布时间】:2011-02-23 13:50:52
【问题描述】:

我正在使用 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 这样的锁吗(具体如何)?

现有代码:

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;

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

谢谢

【问题讨论】:

    标签: c# .net caching transactions locking


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      您始终可以在您拥有的任何“写入”方法周围添加一个锁。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-11
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 2013-06-01
        • 2015-07-19
        • 2018-09-28
        相关资源
        最近更新 更多