Sto lavorando a un'applicazione web Training Enrollment con le seguenti funzionalità (semplificate):
- Manutenzione (aggiunta, modifica, disattivazione) dei corsi di formazione
- Registrazione degli studenti
- Iscrizione degli studenti a corsi di formazione attivi
Ho impiegato Onion Architecture. Tutta la mia logica di business / validazione è nel livello di dominio e il livello di accesso ai dati è costituito da componenti ADO.NET e stored procedure (nessuna logica di business qualunque). Il problema è che poiché la logica di business / validazione è nel dominio, potrebbe esserci una condizione di competizione nei seguenti scenari:
Scenario 1
-
L'allenamento A consente solo un massimo di 50 studenti
-
La formazione A ha attualmente 49 studenti iscritti
-
Nell'applicazione web, due utenti tentano di iscriversi contemporaneamente. A questo punto sono stati generati due thread da due le richieste simultanee all'applicazione Web sono in grado di interrogare 49 utenti, quindi entrambe le convalide hanno successo nel livello Dominio e in entrambi gli utenti possono iscriversi.
Scenario 2
-
L'allenamento A è creato
-
Lo studente A sta tentando di iscriversi alla formazione A
-
Mentre lo studente A sta tentando di iscriversi alla formazione A, un amministratore della formazione decide di disattivare la formazione A. Una condizione di competizione si verifica quando nel livello Dominio, quando accade quanto segue: Nel thread 1 di L'utente 1, che convalida se l'allenamento A è attivo, ha successo (restituisce vero) e allo stesso tempo;
- Nel thread 2, il thread su cui viene disattivato Training A convalida che non ci sono ancora iscrizioni; così che entrambi le convalide hanno esito positivo.
Una soluzione ovvia è aggiungere la logica di business (controllare il conteggio delle iscrizioni, verificare se un allenamento è attivo) nelle mie stored procedure, ma sono riluttante a farlo mentre interrompe il progetto.
La mia logica di convalida ha un singolo punto di ingresso e posso aggiungere un blocco in modo tale che la logica di convalida diventi una sezione critica in modo che una sola operazione (convalida e persistenza DB) avvenga contemporaneamente, ma ciò riduce la concorrenza.
Qualunque approccio alternativo o come è stato risolto nei sistemi su cui hai lavorato?