Question

Je dois être en mesure de créer une nouvelle entité utilisateur uniquement si e-mail fournie est unique.

J'ai toujours traité auparavant en effectuant simple if (!UserSet.Any(...)) avant mon AddToUserSet(...). Cependant, ce n'est pas une solution concurrente et brisera sous forte charge.

Je me suis renseigné sur les transactions, mais autant que je sache je besoin de définir un UPDLOCK sur SELECT aussi, mais EF4 ne supporte pas.

Comment tout le monde gérer cela?

Était-ce utile?

La solution

Vous pouvez forcer le verrouillage en incluant dans la transaction SELECT:

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

utilisera la transaction sérialisable qui est ce que vous avez besoin si vous voulez une solution concurrente pour inserts -. UPDLOCK ne suffit pas de faire en sorte que nouveau record ne soit pas ajouté lors de votre transaction

Cela peut être assez mauvais goulot d'étranglement, donc je suis d'accord avec @paolo:. Il suffit de placer la contrainte unique à la base de données et exception prises pendant insertion si le courrier électronique est pas unique

Livres en ligne :

Indique les éléments suivants:

    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.

serrures Range sont placés dans la gamme des valeurs clés qui correspondent à la conditions de recherche de chaque déclaration exécutée dans une transaction. cela bloque d'autres opérations de mise à jour ou l'insertion des lignes qui serait admissible pour l'une des déclarations exécutées par la transaction en cours. Ça signifie que si l'une des déclarations dans un transaction sont exécutées une seconde temps, ils liront le même ensemble de Lignes. Les verrous de gamme sont maintenus jusqu'à la transaction terminée. C'est le la plus restrictive de l'isolement les niveaux car il verrouille les gammes entières des clés et maintient les verrous jusqu'à ce que finalise de transaction. Car est inférieure concurrency, utilisez cette option seulement si nécessaire. Cette option a le même effet que la mise en HOLDLOCK sur toutes les tables de toutes les instructions SELECT dans une transaction.

Autres conseils

en plus de votre chèque, vous pouvez ajouter un contrainte unique sur le terrain de courrier électronique directement sur la DB

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top