Frage

Ich muss in der Lage sein, eine neue Benutzereinheit zu erstellen nur wenn Die bereitgestellte E -Mail ist einzigartig.

Ich habe das immer zuvor mit einem einfachen durchgeführt if (!UserSet.Any(...)) vor meinem AddToUserSet(...). Dies ist jedoch keine gleichzeitige Lösung und wird unter starker Belastung brechen.

Ich habe mich mit Transaktionen untersucht, aber Afaik müsste ich auch einen Updcock für die Auswahl festlegen, aber EF4 unterstützt dies nicht.

Wie gehen alle anderen damit um?

War es hilfreich?

Lösung

Sie können das Sperren erzwingen, indem Sie in der Transaktion ausgewählt werden:

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

Dadurch werden serialisierbare Transaktionen verwendet. Wenn Sie eine gleichzeitige Lösung für Einsätze wünschen, reicht Sie nicht aus, um sicherzustellen, dass während Ihrer Transaktion keine neue Datensatze hinzugefügt werden.

Dies kann ein ziemlich schlechter Engpass sein, daher stimme ich @paolo zu: Stellen Sie einfach die eindeutige Einschränkung in die Datenbank und fangen Sie die Ausnahme während des Einfügungseinsatzes an, wenn E -Mails nicht eindeutig sind.

Serialisierbare Transaktion von Bücher online:

Gibt Folgendes an:

    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.

Reichweite werden im Bereich der Schlüsselwerte platziert, die den Suchbedingungen jeder in einer Transaktion ausgeführten Anweisung entsprechen. Dadurch werden andere Transaktionen aus der Aktualisierung oder Einfügung von Zeilen blockiert, die sich für eine der von der aktuellen Transaktion ausgeführten Aussagen qualifizieren würden. Dies bedeutet, dass eine der Aussagen in einer Transaktion ein zweites Mal ausgeführt wird, sie dieselbe Zeilenmenge lesen. Die Reichweite werden bis zum Abschluss der Transaktion gehalten. Dies ist die restriktivste der Isolationsniveaus, da es die gesamten Schlüsselbereiche sperrt und die Schlösser bis zur Abschluss der Transaktion enthält. Verwenden Sie diese Option nur bei Bedarf, da die Parallelität niedriger ist. Diese Option hat den gleichen Effekt wie das Festlegen von Holdlock in allen Tabellen in allen ausgewählten Aussagen in einer Transaktion.

Andere Tipps

Zusätzlich zu Ihrem Scheck können Sie a hinzufügen einzigartige Beschränkung Auf dem E -Mail -Feld direkt auf der DB

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top