Как обработать назначение промокода в Entity Framework без коллизий? - PullRequest
0 голосов
/ 13 марта 2009

Допустим, у меня есть таблица промо-кодов и таблица контактов. Каждый контакт может иметь 1 промо-код, и каждый промо-код может быть назначен только 1 контакту. Как бы я использовал программу назначения, которая выбрала бы промо-код из таблицы и присвоила бы его контакту без проблем с параллелизмом / коллизий.

Наихудший сценарий:

  1. Контакт А запрашивает код.
  2. Первый доступный промо-код найден и выбран в БД, промо-код A.
  3. Контакт Б запрашивает код. Первый доступный промо-код найден и выбран из БД, промо-код A.
  4. Изменение контакта A сохранено.
  5. Изменение контакта B сохранено.

Теперь, в зависимости от того, как сохраняется присвоение промокода, произойдет 1 из 2 вещей:

  1. 2 контактам будет присвоен одинаковый промо-код.
  2. Контакт B получит сообщение об ошибке, если возникнет исключение дублирующегося ключа.

К вашему сведению, я использую DataContext, который содержится в HTTPContext, чтобы он был доступен для каждого HTTP-запроса. Не уверен, что это имеет значение.

Итак, используя C # и Entity Framework, как я могу выполнить это назначение промо-кода, не сталкиваясь с этими типами коллизий? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 16 марта 2009

Не могу ли я просто сделать что-то вроде этого:

UPDATE PromoCodes
SET Assigned = 1
ContactID = x
LIMIT 1

Таким образом, мне не нужно заранее читать код, просто присвоить его, а затем, когда я смогу его получить:

SELECT * FROM PromoCodes
Where ContactID = x

Есть комментарии к этому методу?

0 голосов
/ 14 марта 2009

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

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

Это гарантирует, что промо-код будет доступен только один раз.

...