Hallo,
У меня есть веб-сервис, который имеет несколько методов, которые могут быть вызваны.Каждый раз, когда вызывается один из этих методов, я записываю вызов в статистическую базу данных, чтобы мы знали, сколько раз каждый метод вызывается каждый месяц, и среднее время обработки.
Каждый раз, когда я регистрирую статистические данные, я сначала проверяюбаза данных, чтобы увидеть, если этот метод для текущего месяца уже существует, если не строка создается и добавляется.Если он уже существует, я обновляю необходимые столбцы в базе данных.
Моя проблема в том, что иногда, когда я обновляю строку, я получаю исключение "Строка не найдена или изменена", и да, я знаю, что это потому, что строка имеетбыл изменен с тех пор, как я его прочитал.
Чтобы решить эту проблему, я безуспешно пытался использовать следующее:
- Использовать использование вокруг моего текста данных.
- Использовать использование вокругTransactionScope.
- Используйте мьютекс, это не работает, потому что веб-служба (не уверен, я считаю, что это правильно) реплицируется на другом ПК для повышения производительности, но все еще использует ту же базу данных.
- Разрешить конфликт параллелизма в исключении, это не работает, потому что мне нужно получить новое значение базы данных и добавить к нему значение.
Ниже я добавил код, используемый для регистрациистатистические данные.Любая помощь будет принята с благодарностью.
public class StatisticsGateway : IStatisticsGateway
{
#region member variables
private StatisticsDataContext db;
#endregion
#region Singleton
[ThreadStatic]
private static IStatisticsGateway instance;
[ThreadStatic]
private static DateTime lastEntryTime = DateTime.MinValue;
public static IStatisticsGateway Instance
{
get
{
if (!lastEntryTime.Equals(OperationState.EntryTime) || instance == null)
{
instance = new StatisticsGateway();
lastEntryTime = OperationState.EntryTime;
}
return instance;
}
}
#endregion
#region constructor / initialize
private StatisticsGateway()
{
var configurationAppSettings = new System.Configuration.AppSettingsReader();
var connectionString = ((string)(configurationAppSettings.GetValue("sqlConnection1.ConnectionString", typeof(string))));
db = new StatisticsDataContext(connectionString);
}
#endregion
#region IStatisticsGateway members
public void AddStatisticRecord(StatisticRecord record)
{
using (db)
{
var existing = db.Statistics.SingleOrDefault(p => p.MethodName == record.MethodName &&
p.CountryID == record.CountryID &&
p.TokenType == record.TokenType &&
p.Year == record.Year &&
p.Month == record.Month);
if (existing == null)
{
//Add new row
this.AddNewRecord(record);
return;
}
//Update
existing.Count += record.Count;
existing.TotalTimeValue += record.TotalTimeValue;
db.SubmitChanges();
}
}