Вопрос

Мне нужно иметь возможность создавать новую пользовательскую сущность только если Предоставленное электронное письмо уникально.

Я всегда справлялся с этим раньше, выполняя простые if (!UserSet.Any(...)) перед моим AddToUserSet(...). Анкет Тем не менее, это не одновременное решение и будет сломаться под тяжелой нагрузкой.

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

Как все остальные справляются с этим?

Это было полезно?

Решение

Вы можете заставлять блокировку, включив Select In Transaction:

using (var scope = new TransactionScope())
{
    // Create context
    // Check non existing email
    // Insert user
    // Save changes
}

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

Это может быть довольно плохим узким местом, поэтому я согласен с @paolo: просто поместите уникальное ограничение в базу данных и поймайте исключение во время вставки, если электронная почта не является уникальной.

Сериализуемая транзакция от Книги онлайн:

Указывает следующее:

    Statements cannot read data that has been modified but not yet  
    committed by other transactions.

    No other transactions can modify data that has been read by the  
    current transaction until the current transaction completes.

    Other transactions cannot insert new rows with key values that
    would fall in the range of keys read by any statements in the current
    transaction until the current transaction completes.

Блокировки диапазона размещаются в диапазоне значений ключей, которые соответствуют условиям поиска каждого оператора, выполненного в транзакции. Это блокирует другие транзакции от обновления или вставки любых строк, которые будут иметь право на любое из операторов, выполненных текущей транзакцией. Это означает, что если какое -либо из операторов в транзакции будет выполнено во второй раз, они будут читать тот же набор строк. Блокировки диапазона удерживаются до завершения транзакции. Это наиболее ограничительный из уровней изоляции, потому что он блокирует целые диапазоны ключей и удерживает замки до завершения транзакции. Поскольку параллелизм ниже, используйте эту опцию только при необходимости. Эта опция имеет тот же эффект, что и настройка Holdlock на всех таблицах во всех операторах выбора в транзакции.

Другие советы

В дополнение к вашему чеку вы можете добавить уникальное ограничение В поле электронной почты непосредственно на БД

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top