Я пишу синхронизатор, который будет принимать все изменения в одной БД и синхронизировать их с другой БД. Для этого я добавил в моей таблице T
две колонки:Есть ли возможное состояние гонки в этом заявлении UPDATE?
alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0
Теперь я могу легко выбрать все строки, которые были изменены с момента последней синхронизации:
select * from T where LastUpdate > LastSync
Однако после выполнения синхронизации I Should сделайте два поля равными. Но обновление строки также обновляет метку времени, так что я должен сделать это:
update T set [email protected]@DBTS+1 where [email protected]
Но мне интересно, - будет ли это всегда работает? Что, если я прочитаю значение @@DBTS
, а затем другому пользователю удастся вставить/обновить строку где-нибудь до того, как моя строка будет зафиксирована? Является ли этот рискованный код? И если да - как это можно сделать лучше?
Кстати, какая версия и выпуск SQL Server вы? [Изменить захват данных] (http://msdn.microsoft.com/en-us/library/bb522489.aspx) вариант? –
@ Мартин Смит - 2008, я думаю. Не уверен, что у клиента. –
@ Мартин Смит - я проверил захват данных изменений, но это было бы излишним. Простой временной метки будет достаточно. Мне нужно только знать, какие записи еще нужно синхронизировать. Мне не нужна полная история. –