Domanda

Siamo in procinto di passare a un nuovo sistema di database. Il database è di tipo ISAM e l'API non fornisce un modo per rilevare se un record è stato modificato da un altro utente.

Pertanto ho bisogno di implementare questa funzionalità sul lato client. Attualmente sto calcolando un checksum utilizzando i buffer prima e dopo e confrontando il risultato.

La mia domanda è: poiché esiste la possibilità che lo stesso valore di checksum possa essere calcolato per due record diversi, sarebbe meglio avere un campo Timestamp invece?

In che modo viene modificato il rilevamento modificato normalmente?

Grazie.

È stato utile?

Soluzione

Meglio non sarebbe un timestamp, che è inaffidabile, ma un campo intero versione, che il codice client può utilizzare per rilevare le modifiche simultanee in DB.

Questo si chiama "bloccaggio ottimista", quando la transazione non blocca alcuna risorsa DB, fino a quando non è il momento di aggiornare DB. In questo momento blocca le risorse DB necessarie (ad es. Tabelle), legge la versione da DB e controlla se ha un valore previsto. Se sì, questo significa che è sicuro aggiornare il database insieme al numero di versione in DB. In caso contrario, questo significa che c'è stato un aggiornamento simultaneo e le transazioni devono interrompere.

Naturalmente, se avessi un sacco di interruzioni, significa che avresti bisogno di "blocco pessimistico", in cui la tua app blocca qualsiasi risorsa per l'intera transazione. Se il tuo driver DB non lo supporta, avrai bisogno di un altro blocco condiviso, come un mutex. Questo approccio diminuisce la produzione nella maggior parte dei casi, poiché le transazioni simultanee devono attendere fino a quando una transazione libera risorse bloccate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top