Sto scrivendo un software di sincronizzazione che prenderà tutte le modifiche in un DB e le sincronizzerà su un altro DB. A tal fine ho aggiunto nella mia tabella di T
due colonne:C'è una possibile condizione di competizione in questa istruzione UPDATE?
alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0
Ora posso facilmente selezionare tutte le righe che sono state modificate dall'ultima sincronizzazione:
select * from T where LastUpdate > LastSync
Tuttavia dopo aver eseguito la sincronizzazione dovrei rendere i due campi uguali. Ma l'aggiornamento della riga aggiorna anche il timestamp, quindi devo fare questo:
update T set [email protected]@DBTS+1 where [email protected]
Ma mi chiedo - Sarà questo lavoro sempre? Cosa succede se leggo il valore di @@DBTS
e poi un altro utente riesce a inserire/aggiornare una riga da qualche parte prima che la mia riga venga confermata? È questo codice rischioso? E se sì, come potrebbe essere migliorato?
A proposito, qual è la versione e l'edizione di SQL Server? [Change Data Capture] (http://msdn.microsoft.com/en-us/library/bb522489.aspx) è un'opzione? –
@ Martin Smith - 2008, penso. Non sono sicuro di ciò che il cliente ha. –
@ Martin Smith: ho controllato l'acquisizione dei dati di modifica, ma sarebbe stato eccessivo. Un semplice timestamp sarà sufficiente. Ho solo bisogno di sapere quali documenti devono ancora essere sincronizzati. Non ho bisogno della storia completa. –