Ho un problema con il design della mia applicazione, che né la chiusura ottimistica né quella pessimistica tendono a risolvere. Ecco una versione semplificata / alterata del problema che descrive la situazione.
Premessa del problema:
- Un'applicazione di elaborazione dei documenti
- Un database in cui sono archiviati i documenti
- Più client accedono simultaneamente al database
Quello che cerco di ottenere:
Diciamo che ci sono 10 documenti non elaborati nel database. Il primo cliente richiede il numero di documenti non elaborati. La risposta è 10. Ne richiede 6 e inizia l'elaborazione. Prima che finisca, il secondo cliente richiede il numero di documenti non elaborati. Non ha senso che elabori gli stessi documenti del primo cliente, quindi voglio che il programma risponda "Ci sono 4 documenti non elaborati".
Il problema se blocco in modo ottimistico quei 6 documenti:
Nel caso particolare di questa applicazione, la transazione richiederà molto tempo e c'è una grande possibilità che altri client pensino ancora che ci siano 10 documenti non elaborati, non 4.
Il problema se blocco pessimisticamente quei 6 documenti:
Anche in questo caso, la transazione richiede molto tempo per essere completata e l'altro client rimane bloccato in attesa di una risposta sul numero di documenti.
Il problema se accorro la transazione e commetto una modifica di stato prima dell'elaborazione:
C'è una possibilità che si verifichi un'interruzione dell'alimentazione, di conseguenza 6 documenti hanno uno stato "esportato per l'elaborazione", ma in realtà non lo sono.
Quale strategia di blocco alternativa / personalizzata dovrebbe essere selezionata per questo tipo di scenario con accesso concorrente e transazioni lunghe?