Come gestire quando un utente elimina l'oggetto mentre l'altro lo apre in modalità di modifica in una webapp?

2

Sto sviluppando un'applicazione web di tipo CRUD. È un sistema di project management con progetti, pietre miliari, attività, dipendenti, ecc. Ogni dipendente ha il proprio account per accedere e visualizzare il sistema. I problemi arrivano qui:

  1. Se un utente elimina un'attività mentre il secondo lo apre contemporaneamente, il secondo utente otterrà un'eccezione di puntatore nullo se tenta di modificare e salvare, perché l'oggetto non esiste.

  2. Lo stesso problema in una situazione leggermente diversa. Un utente ha una finestra di attività aperta. Il secondo utente cancella un dipendente. Il primo utente tenta di assegnare un'attività al dipendente eliminato (perché è già presente nell'elenco in una casella combinata) e ottiene un'eccezione del puntatore nullo.

  3. Se qualcuno cancella l'oggetto e l'altro utente tenta di aprirlo contemporaneamente (sarà un'eccezione di puntatore nullo durante il tentativo di ottenere un oggetto)

Sto provando a lasciare i dettagli tecnici del progetto perché è così. Ma se aiuta, sto usando il framework Vaadin basato su Java. Il database è MySQL.

Ho pensato a due possibili soluzioni ma non ne sono sicuro:

  1. Cattura un'eccezione di puntatore nullo e stampa un avviso generale sullo schermo ("Mancano alcuni oggetti ...). Ma non sarebbe chiaro per gli utenti che è esattamente successo.

  2. Controlla ogni commit dell'oggetto e se è stato eliminato prendi l'eccezione e fornisci una spiegazione più dettagliata. Ma non sarà d'aiuto nella 3a situazione.

Sono davvero alla ricerca di punti guida, consigli o suggerimenti che puoi fornire su come affrontare adeguatamente queste situazioni. Grazie in anticipo!

    
posta Karolis Valiulis 06.12.2013 - 19:01
fonte

1 risposta

6

Il modo corretto per gestirlo è bloccare l'oggetto quando il primo utente inizia a modificarlo e fare in modo che l'applicazione controlli i blocchi su un oggetto prima di eliminarlo.

Ad esempio, potresti avere una tabella tasks_locks simile a questa:

task_locks
----------
  task_id
  user_id
  lock_timestamp

Quando un utente va a modificare un'attività, l'applicazione deve inserire una riga in questa tabella, con l'Id dell'attività, l'ID dell'utente e l'ora corrente. In questo modo, quando un altro utilizzo tenta di eliminare tale attività, l'applicazione vedrà un record di blocco che indica che l'attività non può essere modificata e deve informare l'utente che l'attività non può essere eliminata. Quando i primi utenti salvano la loro modifica, questa riga può essere rimossa dalla tabella task_locks . Solo allora l'altro utente può cancellare l'attività.

Ovviamente, ti consigliamo di gestire le situazioni in cui un blocco non viene mai rilasciato (forse il client è stato disconnesso prima di poter completare la modifica), quindi avrai bisogno di una procedura per eliminare i blocchi. Potrebbe essere manuale, potrebbe essere automatico (ad esempio eliminare tutti i blocchi che hanno più di 60 minuti), ma è qualcosa che dovrebbe essere considerato.

Con la prima soluzione che proponi, l'utente potrebbe impiegare molto tempo nell'inserimento dei dati, solo per ottenere una NullPointerException. Poi devono reinserire tutti i dati e sperare che nessuno lavori con le loro dipendenze mentre stanno lavorando.

La tua seconda soluzione sembra catturare l'errore in un posto diverso in modo che l'utente ottenga un messaggio migliore, ma non risolverà il problema di dover ripetere tutto il lavoro quando un record è dipendente on è cancellato.

    
risposta data 06.12.2013 - 19:10
fonte