Attualmente ho un problema di progettazione, che non so esattamente come risolvere e quale sarebbe l'approccio migliore.
Quindi quello che ho è un progetto ASP.NET Core WebApi che è in realtà una soluzione in cluster. Ha diversi livelli, ovviamente rappresentazione (API RESTful), servizi, convalida, repository e dati. La soluzione utilizza il database SQL.
Il mio problema attuale è nel livello di validazione. Quindi ho un'azione HttpPost che riceve il parametro X che dovrebbe essere memorizzato in un database SQL. Questo parametro dovrebbe essere unico. Quello che sto facendo nel mio livello di validazione è controllare se esiste già nel database, se esiste = > restituire la risposta Http corretta, se non lo fa, sto aggiornando il database.
Il problema arriva quando viene distribuita l'API e in realtà è una soluzione in cluster. Quindi se abbiamo 2 richieste contemporaneamente potremmo avere un caso in cui entrambe le richieste sono convalidate attraverso il livello di validazione (perché ancora non viene scritto nulla nel database) e quindi 1 delle richieste scriverà correttamente nel database e aggiornerà i dati del record, ma secondo la richiesta riceverà un'eccezione che si troverà nelle entità dati.
Ciò che può essere fatto in quel caso è l'eccezione appropriata nel livello dati da trattare in un modo diverso e naturalmente restituire una risposta adeguata al cliente, ma avverrà solo se aggiungiamo ulteriori vincoli al nostro database SQL e diciamo quella colonna X dovrebbe avere un valore univoco.
Se immaginiamo di non avere accesso al database e non possiamo aggiungere questo vincolo (quindi la colonna X può effettivamente avere gli stessi valori), allora dipendiamo solo dall'API per convalidare.
Non sono sicuro di quale sia la soluzione a questo problema. Ancora una volta, se provo ad aggiungere gli stessi valori che dovrebbero essere unici, ma SQL non li convalida (forse non abbiamo tali permessi per l'accesso) e dipendiamo solo dal nostro WebApi, che potrebbe essere asincrono e il livello di validazione dì "Ok" ad entrambe le richieste, perché DB non è ancora aggiornato, quindi qual è la soluzione.
Grazie in anticipo