Alla ricerca di una raccomandazione sul blocco dei record all'interno di un sistema distribuito

StackOverflow https://stackoverflow.com/questions/207724

  •  03-07-2019
  •  | 
  •  

Domanda

Stiamo cercando di elaborare un modello di progettazione raccomandato per il nostro team quando si tratta di bloccare i record. La tipica scuola di pensiero va in questo modo: 1. L'utente seleziona un record da un elenco 2. Blocca il record con l'id utente 3. Carica il record del record bloccato (nessun blocco, quindi qualcuno ti ha battuto).

Mi sto perdendo qualcosa o sembra essere l'unico modo per farlo? ((Nel nostro caso il blocco ottimistico si rivelerebbe ingombrante e confuso per gli utenti finali. Le modifiche sono spesso piuttosto sostanziali.)

È stato utile?

Soluzione

Il dettaglio che potrebbe rendere la tua amministrazione più impegnativa è eliminare i blocchi in seguito a arresti anomali o errori di connettività. È qui che si trova il compromesso tra blocco ottimista e pessimistico. La fusione o la ripetizione manuale delle modifiche quando il blocco ottimistico fallisce è una seccatura, ma il rastrellamento dopo gli arresti anomali sui modelli di blocco pessimistici e persistenti crea i suoi mal di testa (come chiunque dirà a lungo agli utenti dei sistemi di contabilità supportati da Pervasive negli anni '90) l'opportunità)

Una risposta è utilizzare i meccanismi del tuo RDBMS per la gestione delle transazioni e della concorrenza: prendi il record con SELECT FOR UPDATE o qualsiasi sintassi adatta al tuo ambiente e al livello di isolamento. Se uno dei tuoi client si arresta in modo anomalo o viene disconnesso, la transazione viene ripristinata e il blocco viene rilasciato.

In un ambiente senza connessione come il Web o un ambiente in cui le connessioni vengono perse e ripristinate frequentemente, potrebbe funzionare anche un modello basato sulla sessione con un timeout della sessione:

  • Tentativo di cancellare il blocco esistente nel record se si tratta di una sessione scaduta
  • Tentativo di bloccare il record nel sessionid (errore se il passaggio precedente non è riuscito)
  • Seleziona il record bloccato (Nessun record restituito se il passaggio precedente non è riuscito)

Quindi il blocco viene rilasciato alla scadenza della sessione. Non è necessario rimuovere manualmente i blocchi dopo arresti anomali e una certa tolleranza ai problemi client / connettività. Ci vuole un po 'più di lavoro per codificare.

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