Domanda

Ho un servizio WCF, che ha due metodi esposti:

Nota: Il server servizio WCF e SQL viene distribuito nelle stessa macchina. SQL Server è una tabella chiamata dipendente che mantiene le informazioni sui dipendenti.

  1. Read () Questo metodo recupera tutti i dipendenti dal server SQL.
  2. Scrivi () Questo metodo scrive (aggiungere, aggiornare, cancellare) Info dipendente nella tabella dipendente al server sql.

Ora ho sviluppato un'applicazione basata su desktop tramite il quale ogni cliente può interrogare, aggiungere, aggiornare e cancellare le informazioni sui dipendenti dal consumo di un servizio web.

Domanda:

Come posso gestire la situazione, se i clienti mulitple vogliono aggiornare le informazioni sui dipendenti, allo stesso tempo? Il server SQL si gestisce questo utilizzando blocchi di database ??

Si prega di suggerire me l'approccio migliore !!

È stato utile?

Soluzione

In generale, in un ambiente disconnesso ottimistico concorrenza con un rowversion / timestamp è l'approccio preferito . WCF non di supporto transazioni distribuite, ma che è un ottimo modo per introdurre lungo blocco nel sistema. La maggior parte degli strumenti ORM sosterranno rowversion / timestamp out-of-the-box.

Naturalmente, al server si potrebbe desiderare di utilizzare le transazioni (sia basato sulla connessione o TransactionScope) per rendere i metodi individuale repository "ACID", ma vorrei cercare di evitare transazioni sul filo come per quanto possibile.


Re commenti; Mi dispiace, io onestamente non ho visto tali osservazioni; a volte StackOverflow non rende questo facile se si ottiene un sacco di commenti in una sola volta. Ci sono due diversi concetti qui; l'attesa è un sintomo di blocco, ma se si dispone di 100 clienti di aggiornare lo stesso record è del tutto appropriato a bloccare durante ogni transazione. Per semplificare le cose: a meno che non posso dimostrare un collo di bottiglia (che richiede lavoro extra), vorrei iniziare con una serializable di transazione intorno alle operazioni di aggiornamento (TransactionScope utilizza questa per impostazione predefinita). In questo modo si: si ottiene adeguato blocco (acido ecc) per la maggior parte degli scenari

.

Tuttavia; La seconda questione è la concorrenza: se si ottiene 100 aggiornamenti per lo stesso record, come fai a sapere che fidarsi? Molti sistemi farà si che il prima aggiornare in, e scartare il resto come operano su assunzioni stantio sui dati. Questo è dove il timestamp / rowversion entrare. Per far rispettare "il timestamp / rowversion deve corrispondere" sulla dichiarazione UPDATE, si assicura che le persone possono aggiornare solo i dati che non è cambiata da quando hanno preso il loro snapshot. A tale scopo, è comune per mantenere il rowversion accanto a qualsiasi interessante di dati che si sta aggiornando.

Altri suggerimenti

Un'altra alternativa è che si potrebbe creare un'istanza del servizio WCF come Singleton (InstanceContext.Single) - che significa che c'è una sola istanza di farlo funzionare mai. Quindi, si potrebbe tenere un semplice oggetto in memoria allo scopo di bloccaggio aggiornamento, e bloccare il metodo di aggiornamento sulla base di tale oggetto. Quando chiamate aggiornamento arrivano da altre sessioni, dovranno aspettare fino a quando il blocco viene rilasciato.

Saluti, Steve

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