Ho bisogno di avere una tabella di database MsSql e altri 8 (identici) processi che accedono alla stessa tabella in parallelo - facendo una selezione in alto n, elaborando quelle n righe e aggiornando un colonna di quelle file. Il problema è che ho bisogno di selezionare ed elaborare ogni riga solo una volta. Ciò significa che se un processo arriva al database e seleziona le prime n righe, quando arriva il secondo processo dovrebbe trovare quelle righe bloccate e selezionare le righe da n a 2 * n righe, e così via ...Restituisce righe sbloccate in una query "select top n"
È possibile mettere un blocco su alcune righe quando le selezioni e quando qualcuno richiede le prime n righe che sono bloccate per restituire le righe successive e non aspettare quelle bloccate? Sembra un tentativo lungo, ma ...
Un'altra cosa a cui stavo pensando - forse non così elegante ma suona semplice e sicura, è quella di avere nel database un contatore per le istanze che ha selezionato su quel tavolo. La prima istanza che viene incrementa il contatore e seleziona top n, la successiva incrementa il contatore e seleziona le righe da n * (i-1) a n * i, e così via ...
Questo suono come una buona ideea? Hai qualche suggerimento migliore? Ogni pensiero è molto apprezzato!
Grazie per il vostro tempo.
Sembra che tu stia utilizzando un tavolo come una coda? Potresti trovare [questo articolo] (http: // rusanu.it/2010/03/26/using-tables-as-queues /) di [Remus Rusanu] (http://stackoverflow.com/users/105929/remus-rusanu) utile. –
Grazie per il link. E 'stato interessante saperlo, ma dato che ho bisogno di tenere le righe dopo averle selezionate (eliminarle non è un'opzione), non è davvero applicabile al mio caso. – Diana
Si potrebbe avere una colonna di bit 'processed' e sostituire un' UPDATE' per un 'DELETE' possibilmente. Se si decide di utilizzare una soluzione di conteggio [questa risposta] (http://stackoverflow.com/questions/3453411/sql-server-auto-incrementation-that-allows-update-statements/3462957#3462957) potrebbe essere d'aiuto. –