Как я понимаю, вы пытаетесь уменьшить количество товара при каждой операции продажи.Вы должны сделать это атомарно, потому что вам нужно избегать продажи товара, которого нет в наличии.
Есть несколько вариантов, таких как оптимистическая блокировка с сохранением версии на ваших данных или распределенная блокировка для обеспечения одной операции покупки на предмете..
В sql вы можете запустить оператор обновления с контролем версий, как показано ниже:
update [table]
set count = count - 1
where id=1 and count=5 and version=3
Каждое обновление блокирует строку, поэтому, если в действие вступает другой запрос на обновление, оно ожидает текущее обновление и при выполнении оно влияет на0 строка.
Вы также можете использовать распределенную блокировку с Redis и заблокировать сам процесс.
Это зависит от требований, вариантов использования и ваших ресурсов.
Обновление
Для того, чтобы сделать это с помощью Entity Framework, если вы сначала используете код, вы можете сделать следующий подход:
// add the below property to your entity
[Timestamp]
public byte[] RowVersion { get; set; }
с текущими API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<YourEntity>().Property(s => s.RowVersion).IsConcurrencyToken();
//modelBuilder.Entity<YourEntity>().Property(s => s.RowVersion).IsRowVersion(); // in EF6 or EF Core
base.OnModelCreating(modelBuilder);
}
Или вы можете использовать [ConcurrencyCheck] атрибут:
[ConcurrencyCheck]
public int Version { get; set; }
[ConcurrencyCheck]
public int Count { get; set; }
EF добавит эти столбцы к условию where в ваших запросах на обновление.Если число затронутых строк равно 0 EF throws DbUpdateConcurrencyException , вам нужно его перехватить.
Ознакомьтесь с дополнительной информацией:
https://docs.microsoft.com/en-us/ef/core/modeling/concurrency
Оптимистичный параллелизм: IsConcurrencyToken и RowVersion
https://www.codeproject.com/Articles/817432/Optimistic-Concurrency-in-Entity-Framework-Code-Fi
http://www.binaryintellect.net/articles/14e67064-634c-4206-9eca-a42d3739594a.aspx