Лучший способ заблокировать ядро ​​структуры таблицы сущностей - PullRequest
0 голосов
/ 10 февраля 2020

В настоящее время я работаю над проектом по созданию сайта онлайн-тикетов. У меня есть таблица билетов, которая включает в себя все купленные билеты, связанные с типом и событием.

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

Это пример сценария:

498 проданных билетов

Попытка пользователя 1 и пользователя 2 купить два билета каждый одновременно: Пользователь 1 - сайт проверяет доступные билеты 498 продано, 2 доступно Пользователь 2 - сайт проверяет доступные билеты 498 продано, 2 доступно Пользователь 1 - добавляет 2 строки для купленных билетов, 500 продано Пользователь 2 - добавляет 2 строки для купленных билетов, 502 продано

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

Я использую ядро ​​Entity Framework с. net базовыми страницами бритвы для разработки сайта.

Заранее спасибо,

Мэтт

1 Ответ

0 голосов
/ 29 марта 2020

Стандартное решение заключается в использовании транзакций , которые блокируют таблицу под капотом до успешного завершения операции или отменяют любые изменения, сделанные в случае ошибки.

со связанной страницы :

using (var context = new BloggingContext())
{
    using (var transaction = context.Database.BeginTransaction())
    {
        try
        {
            context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
            context.SaveChanges();

            context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
            context.SaveChanges();

            var blogs = context.Blogs
                .OrderBy(b => b.Url)
                .ToList();

            // Commit transaction if all commands succeed, transaction will auto-rollback
            // when disposed if either commands fails
            transaction.Commit();
        }
        catch (Exception)
        {
            // TODO: Handle failure
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...