Livello di convalida della soluzione WebApi in cluster

2

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

    
posta N Dermendzhiev 31.01.2018 - 11:43
fonte

1 risposta

1

Questo non è un problema di progettazione; è un problema di implementazione.

Devi semplicemente usare una transazione sql. All'interno di quella transazione, controlla l'esistenza del record, se esiste, scrivilo, altrimenti no.

Dovrai modificare i metodi del tuo repository per prendere un token di transazione come parametro.

var t = CreateTransaction();
if (!repository.Exist(parameter, t))
{
    repository.Create(parameter, t));
}
t.Commit();
    
risposta data 31.01.2018 - 14:38
fonte

Leggi altre domande sui tag