Domanda

Ho un farm di server, ogni server sta facendo regolarmente una query identica al database. Questi i risultati della query vengono memorizzati in una cache condivisa, accessibile a tutti i server.

Come posso garantire che una query più recente non ottiene sovrascritto da una query più vecchio? C'è un modo di versioning delle query in qualche modo, da tempo, per esempio, in modo che questo non accade? Come trattare con query simultanee?

Grazie!

Modifica: db è SQL Server. Query è una dichiarazione prescelta. E, caching meccanismo è molto semplice: semplice scrittura, senza bloccaggio. E questo è perché al momento non c'è modo di raccontare l'ordine delle query di selezione.

È stato utile?

Soluzione

Un approccio è quello di avere un contatore di aggiornamento globale nel database, sia per gli aggiornamenti o per legge (aggiornamento è più efficiente, ma anche più difficile da ottenere di destra).

Quindi, ad ogni aggiornamento, anche incrementare il contatore globale. Su ogni lettura, leggere il contatore globale, e inserire i dati nella cache con il valore del contatore. sovrascrivere Solo il contenuto della cache, se il valore del contatore è maggiore.

A causa di isolamento del database, le transazioni dovrebbero apparire come se fossero accaduti in modo seriale (supponendo che si è scelto il livello di isolamento SERIALIZABLE). Che, a sua volta, significa che i numeri del contatore rigorosamente alti si riferiscono a dati più recenti.

Altri suggerimenti

Dove si trova la cache? Si tratta di un file su disco? O una tabella nel database?

E che cosa significa quando si dice una query più vecchio potrebbe sovrascrivere una più recente? Non è forse vero che la query più di recente completato (o forse il più di recente hanno iniziato) è il più recente?

Si dovrebbe bloccare il contenitore di cache prima di eseguire ogni query, se questo è un file o una tabella. Ogni server deve eseguire solo la query se si può ottenere il blocco, altrimenti si deve attendere per la risorsa bloccata. In questo modo la cache conterrà solo i risultati più recenti.

È che lungo le linee di quello che stai chiedendo?

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