Domanda

Ho bisogno di essere in grado di creare una nuova entità utente solo se l'e-mail fornito è unico.

Ho sempre gestito la prima eseguendo un semplice if (!UserSet.Any(...)) prima del mio AddToUserSet(...). Tuttavia, questa non è una soluzione concorrente e si rompe sotto carico pesante.

ho cercato operazioni, ma per quanto ne so io avrebbe bisogno di impostare un UPDLOCK sul SELEZIONA troppo, ma EF4 non supporta questa.

Come tutti gli altri gestire questo?

È stato utile?

Soluzione

È possibile forza di bloccaggio includendo SELECT nella transazione:

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

In questo modo utilizzare la transazione serializzabile che è quello che serve se si vuole una soluzione concorrente per inserti -. UPDLOCK non è sufficiente a garantire che il nuovo record non viene aggiunto durante la transazione

Questo può essere piuttosto male collo di bottiglia così sono d'accordo con @paolo:. È sufficiente posizionare il vincolo univoco per l'eccezione database e ripresa durante inserto se email non è unica

documentazione in linea :

Specifica il seguente:

    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.

blocchi di intervallo vengono inseriti nella gamma dei valori chiave che corrispondono al le condizioni di ogni dichiarazione cercare eseguito in una transazione. questo blocca altre operazioni di aggiornamento, oppure inserendo le righe che si qualificano per qualsiasi istruzioni eseguite dal la transazione corrente. Questo significa che se una qualsiasi delle dichiarazioni in un transazioni vengono eseguite una seconda tempo, che leggeranno lo stesso insieme di filari. I blocchi di intervallo vengono mantenuti fino al completamento della transazione. Questo è il più restrittiva dell'isolamento Livelli perché blocca intere gamme delle chiavi e le serrature tiene fino alla Completa di transazione. Perché la concorrenza è più bassa, utilizzare questa opzione solo quando necessario. Questa opzione ha lo stesso effetto come imposta sul HOLDLOCK tutte le tabelle in tutte le istruzioni SELECT in una transazione.

Altri suggerimenti

in aggiunta al controllo, si potrebbe aggiungere un unico vincolo sul campo e-mail direttamente sul DB

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top