2012-09-17 2 views
5

Ho un database SQL con una tabella che vorrei bloccare. Sto usando Entity Framework. Fondamentalmente, ci sono un numero di processi che ciascuno desidera scrivere contemporaneamente nel database. Ognuno di loro vuole aggiornare una riga in una tabella. Tuttavia, voglio che solo uno di loro sia in grado di farlo allo stesso tempo.Blocco tabelle in Entity Framework

C'è un modo per bloccare un'intera tabella, tale da impedire a chiunque di inserire nuove righe o aggiornare le righe?

Grazie, Christian

+2

Questo è il comportamento predefinito.Non dovresti fare nulla, a parte usare le transazioni, se stai cambiando diversi tavoli in una sola operazione –

risposta

2

Non è chiaro per me perché si vuole questo, ma se si vuole veramente bloccare l'intera tabella si potrebbe:

  • Spegnere riga e blocco pagina in modo che tutto intensifica a una tabella bloccare

Esempio adattato da here:

ALTER INDEX [MyIndexName] ON [dbo].[MyTableName] SET (ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = OFF) 

Nota: questo presuppone l'applicazione esclusivamente "possiede" queste tabelle - non vorrebbe applicare questo e rompere qualche altra applicazione

  • Impostare le vostre domande a utilizzare livello di isolamento serializzabile

Esempio adattato da here:

TransactionOptions topt = new TransactionOptions(); 
topt.IsolationLevel = System.Transactions.IsolationLevel.Serializable; 
using (var tran = new TransactionScope(TransactionScopeOption.Required, topt)) { 
    //do stuff 
} 
+0

sì, quello era quello che stavo cercando. Grazie! – Christian

0

Dalla descrizione breve, è dubbio che un blocco del tavolo è davvero ciò che è necessario per risolvere questo problema. Alcune soluzioni comuni che sono molto più scalabili sono:

1) Creare una transazione serializzabile che legge o aggiorna il record di interesse come prima affermazione. Tutti gli aggiornamenti dovrebbero cercare di seguire questo schema.

2) Creare una transazione read_committed come (1) ma includere un'abilità di rilettura/retry su un'eccezione di concorrenza.

È raro che sia necessario bloccare un tavolo. Un caso può essere necessario quando sono coinvolti alcuni calcoli per un valore del campo di identità determinato manualmente e una possibilità di collisione con un'altra sessione.

Per solo per chiamare, è possibile creare una transazione e bloccare la tabella all'inizio. Il blocco può essere "X" (esclusivo) per impedire letture e scritture o non esclusive solo per impedire le scritture. Questa risposta utilizza un SP:

SO #3662766

In alternativa, un blocco applicazione potrebbe anche essere usato.

sp_getapplock