Это будет одна из тех худших из худших ситуаций, когда вы захотите предложить что-то совершенно другое. Не волнуйтесь, я знаю, и, к сожалению, я ничего не могу с этим поделать, поэтому постарайтесь ограничить ваши ответы теми, которые объясняют наименьшее возможное изменение, которое окажет наибольшее влияние.
С учетом сказанного, вот моя ситуация: существует процесс, который реплицирует данные с сервера Sybase (15.5) на SQL Server (2008 R2) каждые 30 минут в рабочее время. На сервере SQL есть связанный сервер с базой данных Sybase, из которой мы копируем таблицы. Вот страшная часть: копирование выполняется путем УДАЛЕНИЯ всех существующих строк и ВСТАВЛЕНИЯ новых из Sybase, таким образом (в рамках хранимой процедуры на SQL-сервере, запускаемой программным обеспечением для планирования предприятий):
-- Table 1
DELETE FROM abc1;
INSERT INTO abc1 (col1, col2, col3)
SELECT col1, col2, col3 FROM LINKED.SERVER.dbo.abc1;
GO
-- Table 2
DELETE FROM abc2;
INSERT INTO abc2 (col1, col2, col3)
SELECT col1, col2, col3 FROM LINKED.SERVER.dbo.abc2;
GO
-- ... and so on for hundreds of tables
На копии сервера SQL отсутствуют индексы, первичные ключи, внешние ключи или целостность данных, но мы можем контролировать схемы таблиц; мы не можем, однако, коснуться сервера Sybase. База данных MSSQL - это в основном доступная только для чтения среда для отчетов и поиска. Производительность не критична. Так было в течение многих лет, и поэтому оно живет ...
Если у вас еще не было рвоты, возможно, вы уже подумали о проблеме: время от времени, в течение нескольких секунд, наши приложения и отчеты не могут найти (а иногда и не могут получить доступ) данные в таблицы, в то время как они удаляются и вставляются в.
Я не администратор, поэтому такие вещи, как блокировки таблиц, блокировки блокировки, эксклюзивные блокировки и т. Д., Мне чужды, но я понимаю, что, возможно, они могли бы помочь в этой ситуации. Прочитав статью MSDN о табличных подсказках, мой мозг говорит мне, что я должен что-то делать с транзакциями и блокировками таблиц. Я понятия не имею, что, скажем, будет делать следующее, потому что я также не уверен, как это проверить:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
-- Table 1
BEGIN TRANSACTION UpdateAbc1
DELETE FROM abc1 WITH (TABLOCK, HOLDLOCK);
INSERT INTO abc1 WITH (TABLOCK, HOLDLOCK) (col1, col2, col3)
SELECT col1, col2, col3 FROM LINKED.SERVER.dbo.abc1;
COMMIT TRANSACTION UpdateAbc1
-- Table 2
BEGIN TRANSACTION UpdateAbc2
DELETE FROM abc2 WITH (TABLOCK, HOLDLOCK);
INSERT INTO abc2 WITH (TABLOCK, HOLDLOCK) (col1, col2, col3)
SELECT col1, col2, col3 FROM LINKED.SERVER.dbo.abc2;
COMMIT TRANSACTION UpdateAbc2
Итак, мои вопросы:
- Будет ли изменение хранимой процедуры включать транзакции и блокировку разрешать запросы к таблицам, которые собираются изменить, чтобы они продолжались, не возвращаясь пустыми и / или вызывая взаимоблокировки?
- Если нет, и если бы вы могли что-то изменить (на сервере SQL), что бы это было?
Sybase и Microsoft SQL Server находятся в точке, где возможна нормальная репликация базы данных, и это было рассмотрено, но задача слишком громоздка для нашей группы и нашего бюджета.