Стоит ли добавлять Locks или TransactionScope при использовании .Net Cache? - PullRequest
3 голосов
/ 23 февраля 2011

Я использую HttpContext.Current.Cache для кэширования данных из БД (веб-приложение .Net 4).

Я хочу убедиться, что у меня нет проблем с синхронизацией потоков.

Сценарий: 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. Предоставляет ли Cache какой-либо тип блокировки?

  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;

Решит ли это какую-нибудь проблему с потоками?

Спасибо

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Вам не о чем беспокоиться.Класс является потокобезопасным.

0 голосов
/ 23 февраля 2011

Если вы используете SQL для хранения кэша, тогда SQL будет блокировать строку во время ее записи (в пессимистическом режиме, который используется по умолчанию), поэтому вам не придется об этом беспокоиться.Транзакции не будут обеспечивать безопасность потоков, но вы должны делать это в любом случае при внесении изменений, которые должны быть согласованными.

Вы всегда можете добавить блокировку для любых имеющихся у вас методов «записи».

Если вы хотите убедиться, что когда любой пользователь вызывает метод «чтения», он получает абсолютную последнюю версию, тогдатакже заблокируйте эти методы.

...