Синхронизировать доступ к данным - PullRequest
0 голосов
/ 18 октября 2010

Несколько лет назад я создал для своих коллег файл Excel, который отображает множество данных из внешнего источника данных ODBC.Данные разбиты на множество таблиц данных на разных листах.Файл также содержит кнопку, которая позволяет пользователю обновлять данные.

Поскольку доступ к данным из внешнего источника был очень медленным, я реализовал некоторую логику кэширования, в которой сохранялись части результатов, которые вряд ли могли измениться., во внешних таблицах на нашем сервере SQL и сделал некоторую магию, чтобы синхронизировать данные.Сам файл Excel получает доступ только к SQL-серверу.Каждая таблица данных использует SPROC для получения части данных.

Перемотка вперед на 5 лет.Файл Excel увеличился в размере и содержит так много листов и данных, что у нашего Excel (все еще версия 2003) возникли проблемы с ним.Поэтому мои коллеги разбили файл на две половины.

Проблема в том, что оба файла Excel содержат логику для обновления данных, и может случиться так, что пользователь нажимает кнопку обновления в файле №.1, пока другой пользователь уже обновляет файл №.2.

В этот момент логика обновления приходит в бешенство и создает мусор.

Запуск обновления требуется только один раз для обоих файлов Excel, поскольку он обновляет все данные, отображаемые в обоих файлах.Это довольно дорого и длится от 5 до 15 минут.

Я также могу разбить прогон обновления на две половины, но это не ускорит процесс, и обновление двух файлов займет вдвое больше времени.

Я думаю о каком-то мьютексе: пользователь A нажимает кнопку обновления, и начинается обновление.Пользователь B тоже хочет обновить, но логика (VBA / SPROC) обнаруживает, что обновление уже запущено, и ожидает его завершения.

Ответы [ 2 ]

1 голос
/ 18 октября 2010

Но когда A закончил, B запустит обновление «ни за что».

Вместо этого: Когда A нажимает на обновление, вызывает сохраненный процесс, который запускает обновление асинхронно.Когда обновление начинается, оно смотрит в последний раз, когда оно запускалось само и выходит, если оно было меньше X минут назад.

1 голос
/ 18 октября 2010

Вы можете выполнить обновления в Транзакции с Сериализуемым уровнем изоляции;Ваш код обновления должен будет обнаруживать и обрабатывать ошибку SQL Server 1205 (и сообщать пользователю о том, что выполняется другое обновление).

В качестве альтернативы, добавьте метку времени перевода строки в каждую строку и обновляйте только строку, если она не 'не был изменен с момента загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...