Domanda

Quali sono i modi migliori per gestire la concorrenza dell'input dell'utente?

Poiché le risposte a questa domanda escludono già il blocco del database , come gestite gli input simultanei dell'utente in generale?

Il blocco è sempre una cattiva idea, anche se non è implementato dal blocco delle righe? Esistono buone pratiche che non dipendono dal caso specifico? Quali sono state le tue esperienze con le tue strategie?

EDIT: sono a conoscenza della gestione della concorrenza a livello di dati attraverso le transazioni: se due utenti attivano contemporaneamente una modifica complessa dei dati, la transazione lo gestirà.

Ma sono interessato a gestirli o almeno a reagire a loro sul livello della GUI. Cosa succede se la modifica dei dati fa parte di un'operazione prolungata con l'interazione dell'utente?

Supponiamo che due o più utenti stiano modificando lo stesso file su un'interfaccia web. Ad un certo punto uno degli utenti preme il pulsante Salva. Cosa succede agli altri utenti?

  • Saranno avvisati e / o costretti a ricaricare? O eventualmente sovrascriverà le modifiche del primo utente?
  • Devo bloccare il file e impedire a più utenti di modificare lo stesso file?
  • Posso mettere l'intero processo di modifica in una transazione (ne dubito fortemente, ma chi lo sa ...)

Qual è il modo migliore per gestire questa e altre situazioni simili? Ci sono altre strategie?

È stato utile?

Soluzione

La migliore strategia dipende da cosa dovrebbe dal punto di vista del processo (aziendale) - anche le domande importanti sono cosa gli utenti si aspetterebbero normalmente e cosa li sorprenderebbe di meno, e, naturalmente, se è fattibile attuare ciò che si aspettano.

Il tuo esempio di modifica di un file via web può essere suddiviso come segue:

  1. controlli utente1 out / gets / download / opens file v0
  2. controlli utente2 out / gets / download / opens file v0
  3. user1 apporta modifiche alla sua copia di file v0
  4. user2 apporta modifiche alla sua copia di file v0
  5. user1 salva la versione del file v1 sul server
  6. user2 salva la versione del file v2 sul server

Si noti che è tipico per le applicazioni Web, e anche per i normali programmi desktop per ufficio, che le ultime modifiche che l'utente rende disponibili (ad altri) solo dopo averle salvate, il che significa che non si tratta di avere la digitazione del collega appare sopra la tua nella copia del file che stai modificando.

Un approccio classico al controllo della versione è che per l'utente1 non cambia nulla rispetto al normale processo di modifica / salvataggio del desktop.

Per l'utente2, tuttavia, quando tenta di salvare v2 sul server, l'applicazione deve verificare se sono state apportate modifiche alla versione del file v0 dall'ultimo download dell'utente. Dato che questo è il caso, un sistema di controllo della versione in genere gli mostrava entrambe le versioni (v1 e v2) sullo schermo fianco a fianco e gli permetteva di mescolarle e salvare la versione risultante (v3) sul server.

Per i file di testo esistono numerosi strumenti e sistemi sia su Unix che su Windows che tentano di automatizzare il processo in modo che se le aree del file modificate non si sovrappongono, le modifiche vengono unite automaticamente.

L'alternativa è bloccare il file per user2 fino a quando l'utente1 non ha terminato di modificarlo.

L'inserimento di modifiche nella transazione non è in genere rilevante. È l'operazione finale che tenta di sovrascrivere il file esistente con una nuova versione, che è importante. La modifica avviene in modo indipendente su ogni workstation degli utenti e non tocca il server fino all'ultimo punto (salvataggio).


Il tuo esempio è, in ogni caso, nettamente diverso da un'altra situazione come la prenotazione dei biglietti aerei o la prenotazione di un appuntamento con un medico.

Al momento della prenotazione dei biglietti, c'è un numero limitato di posti in un aereo. È possibile, a causa del fatto che il trasferimento dei dati non è realmente importante per più di una persona effettuare una prenotazione sullo stesso ultimo posto su un aereo.

Pertanto, la prenotazione dovrebbe essere almeno una procedura in due passaggi:

  1. il sistema mostra slot liberi;
  2. l'utente richiede uno degli slot liberi (S1);
  3. Il sistema
  4. indica all'utente se lo slot è davvero ancora gratuito e, in tal caso, te lo riserva.
  5. l'utente completa la prenotazione.

Il "quot ancora davvero gratuito" il passaggio è perché le informazioni sulle visualizzazioni degli utenti della pagina Web non vengono in genere aggiornate in tempo reale, quindi tra i passaggi 1 e 2 è possibile che un altro utente abbia richiesto lo slot gratuito.

Altri suggerimenti

Cerca come gestire " transazioni " in qualunque lingua / API del database che stai utilizzando. Se li progetti correttamente, li gestirà per te.

E per capire la teoria, raccomanderei Sistemi distribuiti di Couloris et al ma ci sono molti altri buoni libri.

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