Piszę oprogramowanie synchronizujące, które zajmie wszystkie zmiany w jednym DB i zsynchronizuje je z innym DB. W tym celu Dodałem w moim stole T
dwóch kolumnach:Czy istnieje możliwość wyścigu w instrukcji UPDATE?
alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0
Teraz mogę łatwo wybrać wszystkie wiersze, które zostały zmienione od czasu ostatniej synchronizacji:
select * from T where LastUpdate > LastSync
Jednak po przeprowadzeniu synchronizacji Powinienem uczynić dwa pola równymi. Ale aktualizacja wiersza aktualizuje także znacznik czasu, więc muszę to zrobić:
update T set [email protected]@DBTS+1 where [email protected]
Ale zastanawiam się - czy to zawsze zadziała? Co się stanie, jeśli odczytam wartość @@DBTS
, a następnie inny użytkownik zdoła wstawić/zaktualizować wiersz gdzieś przed zatwierdzeniem mojego wiersza? Czy to ryzykowny kod? A jeśli tak, to w jaki sposób można go ulepszyć?
Przy okazji, w jakiej wersji i wersji programu SQL Server jesteś? Czy opcja [Zmień dane przechwytywania] (http://msdn.microsoft.com/en-us/library/bb522489.aspx) jest opcją? –
@Martin Smith - 2008, myślę. Nie wiem, co klient ma. –
@Martin Smith - Sprawdziłem przechwytywanie danych zmian, ale to byłaby przesada. Wystarczy prosty znacznik czasu. Muszę tylko wiedzieć, które rekordy muszą zostać zsynchronizowane. Nie potrzebuję pełnej historii. –