Domanda

Stiamo cercando di implementare il blocco ottimistico nella nostra applicazione WCF / WPF. Finora il modo migliore che ho escogitato per fare questo è implementare un generico Optimistic che memorizzerà una copia dell'originale e tutte le modifiche (quindi memorizzerà due copie: l'originale e modificato) di qualsiasi oggetto valore che può essere modificato. È questo il modo migliore per farlo?

Ad esempio: un UserVO verrà racchiuso dal generico come un ottimista. Quando viene apportata una modifica all'ottimista, la modifica verrà apportata alla copia modificata archiviata nell'ottimista, mentre l'originale memorizzato anche nell'ottimista rimarrà intatto. Il problema principale sembra essere che utilizzerà il doppio dello spazio e quindi la larghezza di banda.

Grazie

MODIFICA La soluzione deve essere indipendente dal database e sarebbe utile poter specificare una politica di risoluzione dei conflitti per oggetto valore. (ad es. un oggetto utente potrebbe tentare di unirsi se le righe aggiornate non fossero modificate, ma un oggetto transazione richiederebbe sempre l'intervento dell'utente).

È stato utile?

Soluzione

Se si utilizza SQL Server è possibile utilizzare una colonna timestamp. La colonna del timestamp viene modificata ogni volta che viene modificata una riga. Essenzialmente durante l'aggiornamento del DB è possibile verificare se la colonna timestamp è la stessa di quando il client ha ricevuto i dati per la prima volta, in tal caso nessuno ha modificato i dati.

Modifica

Se si desidera ridurre al minimo la larghezza di banda, è possibile emulare il concetto di data / ora aggiungendo un numero di versione su ciascun oggetto. Quindi ad esempio:

  1. Il client 1 richiede l'oggetto, sever restituisce l'oggetto V1
  2. Il client 2 richiede l'oggetto, il server restituisce l'oggetto v2
  3. Il client 1 modifica l'oggetto rimandandolo al server come V1
  4. Il server confronta la versione e vede v1 = v1 in modo da confermare la modifica
  5. Il server incrementa la versione dell'oggetto, quindi ora la sua v2
  6. Oggetto client 2 modifis che lo rimanda al server come v1
  7. Il server confronta la versione e vede v1! = v2, quindi esegue qualunque sia la tua politica

Per configurare la politica, è possibile definire in una configurazione un oggetto specifico che gestirà gli errori della politica in base al tipo di oggetto radice. Potresti creare un'interfaccia IOptomisticCheckFailurePolicy e probabilmente utilizzare una delle librerie DI come la mappa della struttura per creare l'oggetto quando ne hai bisogno (Anche se puoi caricarlo facilmente usando la riflessione)

Altri suggerimenti

Un modo per implementare una logica di blocco ottimista è basarlo su un ultimo timestamp modificato di una riga. Quindi l'aggiornamento avrà il seguente aspetto:

AGGIORNAMENTO .... DOVE id = x AND last_updated = t

x: ID record. t: l'ultimo timestamp aggiornato della riga quando è stato caricato dal database (ovvero prima delle modifiche).

Si noti che uno dei campi che devono essere aggiornati direttamente o indirettamente è il timestamp da impostare ora (o UtcNow).

In questo modo l'aggiornamento fallirà nel caso in cui il record fosse modificato in background. Una volta che l'aggiornamento non è riuscito, è possibile inviare ulteriori query per rilevare la causa dell'errore. Ad esempio,

  1. Il record è stato eliminato.
  2. Il record è stato modificato.

Questo semplice approccio fornisce un blocco ottimistico a livello di riga, non è basato su colonne e non ha risoluzione dei conflitti.

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