Мне кажется, я понимаю ваш вопрос:
Каждый клиент поддерживает отключенный набор данных и периодически обновляет свою локальную копию набора данных.
Вы используете отметку времени SQL-92 (которая отличается от отметки времени SQL Server; одна - это дата-время, другая - двоичная версия строки) для отслеживания обновлений, чтобы вы могли найти дельту в наборе данных и обновитьклиентов.
При таком подходе возникают проблемы, поскольку ваши метки времени рассчитываются до того, как транзакция будет полностью зафиксирована, а последующие транзакции вычисляют более новые метки времени, но могут фиксироваться до того, как более старые транзакции и ваша «последняя метка времени» пропустят некоторые или все записи.
Так что же можно сделать?
Сам факт того, что это такой "сложный орех, который можно взломать", является хорошим свидетельством того, что это нетипичная модель проектирования, хотяЯ предполагаю, что об изменении этой модели не может быть и речи.
Вот несколько решений, которые могут работать.
Внесите «погрешность» в свои обновления.Если ваше последнее обновление было 2011-08-06 23:14:05, вычтите несколько минут (вам придется выяснить, каков этот предел погрешности) и получите эти обновления.Это было бы вашим быстрым решением для лейкопластыря.Если вы хотите усовершенствовать это решение, используйте временную метку SQL Server (автоматическая двоичная версия строки), вычислите контрольную сумму всех строк и сохраните ее в локальном наборе данных и сравните строки во время обновления.
Ленивый обновляет.Опять же, используйте отметку времени SQL Server (rowversion) для управления версиями строк и проверьте изменения, прежде чем пользователю будет разрешено редактировать, если отметки времени не совпадают, выполните обновление.При проверке используйте подсказку NOWAIT, чтобы определить, редактируется ли строка в данный момент.Обычно вы выполняете эту проверку снова при сохранении, чтобы убедиться, что нет конфликта (http://www.mssqltips.com/tip.asp?tip=1501) это более типичный подход.
В конечном счете, вам не нужно поддерживать весь свойнабор данных на клиенте. SQL Server очень хорошо для обработки параллелизма и нескольких пользователей. Если вам нужно выполнить поиск по локальным данным, может быть лучше выполнить эти поиски на сервере.сталкиваясь с проблемами блокирования, может быть лучше сосредоточиться на попытке сократить продолжительность транзакции. В общем, ужасно, чтобы транзакция была открыта в ожидании ввода пользователя. Ваш вопрос указывает, что может иметь местоно я терпеть не могу предполагать что-либо.
Кроме того, идеи / варианты становятся все хуже и хуже (например, вы можете помещать экземпляры SQL (Express?) на клиентов и использовать репликацию, чтобы выталкивать изменения и использовать эти экземпляры).для локального хранилища данных. Но задержка репликации может быть серьезной проблемой, и я уверен,это вызовет больше проблем, чем решит.)
Есть еще одна возможность
Я могу ошибаться в своей интерпретации вашего вопроса.Возможно, вы вычисляете метку времени обновления на клиенте, а затем сохраняете ее на сервере.Если дело обстоит именно так, вместо того, чтобы передавать явную дату-время на сервер, передайте GETDATE ().Это вычислит дату и время на лету.
Если кода слишком много для рефакторинга, вы также можете обработать его с помощью триггера:
Простой пример:
CREATE TRIGGER Trig_MyTable_Update ON dbo.MyTable FOR INSERT, UPDATE
AS
IF @@ROWCOUNT=0 RETURN
UPDATE U SET UpdateDT = GETDATE()
FROM MyTable U INNER JOIN INSERTED I ON U.Id = I.Id