Un po 'comune logica di programmazione mi ritrovo attuazione spesso è qualcosa di simile al seguente pseudo-codice:Sincronizzazione database di Access in un Distributed App
Let X = some value
Let Database = some external Database handle
if !Database.contains(X):
SomeCalculation()
Database.insert(X)
Tuttavia, in un programma multi-threaded abbiamo una condizione di competizione Qui. Il thread A potrebbe controllare se è Database
, trovare che non lo è, e quindi procedere a chiamare SomeCalculation()
. Nel frattempo, la Discussione B controllerà anche se , , trova che non è, e inserire una voce duplicata.
Così, naturalmente, questo deve essere sincronizzata come:
Let X = some value
Let Database = some external Database handle
LockMutex()
if !Database.contains(X):
SomeCalculation()
Database.insert(X)
UnlockMutex()
Questo va bene, se non quello che se l'applicazione è un'applicazione distribuita, in esecuzione su più computer, i quali comunicano con lo stesso back macchina di database di fine? In questo caso, un Mutex è inutile, perché sincronizza solo una singola istanza dell'app con altri thread locali. Per fare questo, avremmo bisogno di una sorta di tecnica di sincronizzazione distribuita "globale". (Si supponga che i duplicati semplicemente non permettendo a Database
non è una strategia praticabile.)
In generale, quali sono alcune soluzioni pratiche a questo problema?
mi rendo conto questa domanda è molto generica , ma io non voglio fare questa una domanda specifica per il linguaggio, perché questo è un problema che si presenta in più lingue e diverse tecnologie di database.
Ho volutamente evitato specificando se sto parlando di un RDBMS o SQL database, rispetto a qualcosa di simile a un database NoSQL, perché ancora una volta - Sto cercando risposte generalizzate basate su pratiche del settore. Ad esempio, questa situazione potrebbe essere risolta da Atomic Stored Procedure? O le transazioni atomiche? O è qualcosa che richiede qualcosa come un "Mutex distribuito"? O più in generale, questo problema viene generalmente risolto dal sistema di database o è qualcosa che l'applicazione stessa deve gestire?
Se risulta che questa domanda è impossibile rispondere a tutti senza ulteriori informazioni, per favore dimmi che posso modificarlo.