Спасибо, отличное объяснение. Не хватает только демонстрации того как отработали решения с повторами и хинтами. Я имею в виду не бенчмарк, а суммы товаров при параллельном запуске.
// Политика повторов через Polly readonly RetryPolicy _concurrencyExceptionRetryPolicy = Policy .Handle() .Retry( retryCount: 100, onRetry: (exceptiona, b) => { Interlocked.Increment(ref RetryCounter); }); // Обновление с использованием политики _concurrencyExceptionRetryPolicy.Execute(() => { using var db = GetDbContext(); var company = GetRandomSKU(); var value = db.WarehousesWithConcurrencyCheck .First(i => i.SKU == company); value.Amount++; db.SaveChanges(); }); // И проверка сумм примерно так public void ShowResultWithoutConcurrencyCheck() { var db = GetDbContext(); var value = db.Warehouses.Select(i => i.Amount).Sum(); Console.WriteLine($"A:{value}"); if (value != 100) Console.WriteLine("Error!!!!"); } P.S. Код не выкладывал - он не красивый и мне за него чуток стыдно :-)
Супер! Спасибо, оч круто, то что нужно
Хорошо рассказал, доступно. Спасибо
Спасибо, отличное объяснение. Не хватает только демонстрации того как отработали решения с повторами и хинтами. Я имею в виду не бенчмарк, а суммы товаров при параллельном запуске.
В примере мы увеличивали число ста разных товаров на единичку. А проверяли сумму позже, чтобы убедиться что всё обновилось корректно.
// Политика повторов через Polly
readonly RetryPolicy _concurrencyExceptionRetryPolicy = Policy
.Handle()
.Retry(
retryCount: 100,
onRetry: (exceptiona, b) =>
{
Interlocked.Increment(ref RetryCounter);
});
// Обновление с использованием политики
_concurrencyExceptionRetryPolicy.Execute(() =>
{
using var db = GetDbContext();
var company = GetRandomSKU();
var value = db.WarehousesWithConcurrencyCheck
.First(i => i.SKU == company);
value.Amount++;
db.SaveChanges();
});
// И проверка сумм примерно так
public void ShowResultWithoutConcurrencyCheck()
{
var db = GetDbContext();
var value = db.Warehouses.Select(i => i.Amount).Sum();
Console.WriteLine($"A:{value}");
if (value != 100) Console.WriteLine("Error!!!!");
}
P.S. Код не выкладывал - он не красивый и мне за него чуток стыдно :-)
Большое спасибо, очень полезное видео. Как сделать в Efcore for update skip locked? и есть ли nuget расширение для PostgreSql?
Спасибо. Хорошо и доступно объяснил.