Возможно ли обновить базу данных SQL Server и базу данных Informix одновременно?
Мне было интересно, можно ли одновременно добавить / обновить / удалить таблицу базы данных SQL Server, а также таблицу базы данных Informix.
Обе базы данных будут иметь одну и ту же таблицу (данные и все), поэтому запрос будет меняться только в зависимости от того, к какой базе данных он собирается. По какой-то причине нам нужны данные внутри обеих баз данных, и они хранятся в реальном времени.
Возможно ли это сделать с помощью SQL Trigger или SProc?
Любое понимание того, как это сделать, или толчок в правильном направлении, будет очень цениться.
3 ответа
Делаем синхронное обновление, т.е. распределенная транзакция с использованием связанного сервера, возможная для триггера, хотя технически возможная, я бы определенно не советовал. Аарон ставит вопрос о том, насколько надежен XA в целом, но моя точка зрения другая: доступность. Ваше обновление в SQL Server не будет выполнено, если он не сможет подключиться и обновить в Informix. Время простоя (исправления, обслуживание, не говоря уже о бедствиях) сайта Informix будет означать время простоя сайта SQL Server, что приводит к быстрому движению ваших пяти девяти к девяти пятым... Именно поэтому я настоятельно рекомендую отделить применение обновлений. Транзакционная репликация является таким примером разъединения, и она поддерживает гетерогенные среды (т. Е. Клиент Informix нисходящий, чтобы принять изменения).
У вас будет задержка видимости обновления (состояние в SQL Server будет отражаться в Informix после задержки, которая может составлять миллисекунды, секунды, минуты и даже часы в плохой день). И обновления являются односторонними, ничего не возвращается с Informix на SQL Server. Но репликация мастер-мастер в гетерогенной среде - это то, что даже Чак Норрис не попытался бы просто сказать.
Для поддержки двух разных СУБД с помощью одной транзакции необходим монитор транзакций, такой как система XA, для координации транзакций. Есть такие системы. Спецификация XA обычно является базовым стандартом. И Microsoft SQL Server, и IBM Informix работают с такими системами, и возможно, что SQL Server и Informix управляются одним и тем же монитором транзакций. У меня меньше сомнений в технической компетентности таких систем, чем у других, которые ответили; Я разделяю их опасения по поводу того, подходит ли это вам.
Такие системы очень тяжелые. Если вам нужна согласованность, для всех транзакций, которые изменяют одну таблицу, описанную в вопросе, для этого потребуется использовать одни и те же службы XA (множественное число; вероятно, один для вставки, один для обновления, один для удаления). Кроме того, если те же транзакции должны управлять и другими таблицами, необходимо добавить и использовать службы для этих таблиц. Именно этот аспект затрудняет управление такими системами.
Использование системы репликации с возможностью задержки до согласования сайтов, вероятно, лучше, чем попытка абсолютной синхронности, если не существует убедительных требований к такой синхронности.
Если действительно существует потребность в абсолютной синхронности, используйте монитор транзакций.
- Не катите свои собственные.
Их трудно понять правильно. Обрабатывать все особые случаи сложно. И (в предположении, что вам нужна абсолютная синхронность) сделать это неправильно - это дорого, но легко.
Это зависит от вашего определения "возможно". Технически, вы можете использовать технику, называемую " двухфазная фиксация".
Идея состоит в том, что вы отправляете данные в обе базы данных, а затем команду "prepare commit", которая делает все необходимое для фиксации данных, кроме фиксации. Если подготовка не удалась, то и фиксация тоже не удалась. Если подготовка успешна, то фиксация должна быть успешной.
Блестящая идея, не работает на практике. Одним из распространенных случаев является то, что вы отправляете коммит в обе базы данных, и одна из них теряется в пути (отключение сети). Бывает редко, но когда это происходит, у вас непоследовательное состояние и, поскольку этот шаг не должен провалиться, нет хорошего способа очистки.
Так что мое решение работает так:
Вы загружаете данные в новую таблицу, в которой есть два дополнительных столбца, в которых можно сказать, что "сервер X видел эту запись"
Вы добавляете задание, которое копирует все задания для сервера X на сервер X и обновляет соответствующий столбец. Напишите задание таким образом, чтобы оно могло быть прервано и перезапущено в любое время (т.е. оно должно быть в состоянии справиться со случаями, когда данные уже существуют на целевой стороне).
Таким образом, вы можете распространять данные на любое количество серверов согласованным и отказоустойчивым способом.