Обработка исключений в режиме реального времени, система, управляемая SQL-сервером - PullRequest
0 голосов
/ 14 июля 2010

Я разработал средство просмотра отчетов в .NET Winforms (оно просто выполняет запросы и отображает результаты).

Это работает против базы данных отчетов. Тем не менее, вышеупомянутое является небольшим подмножеством гораздо более крупного приложения, которое получает данные из другой базы данных. Это выглядит так:

Отслеживаемая система имеет изменение в состоянии (например, увеличивается задержка) => Событие записывается в базу данных SQL Server (вызывается эта база данных A) как транзакция => Это вызывает триггер для записи того же события в базу данных отчетов.

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

В любом случае, упоминался термин, что база данных отчетов «транзакционно зависит» от основной базы данных. Что именно это означает? База данных отчетов полностью зависит от транзакций базы данных A? Это заставило меня задуматься над некоторыми вопросами:

1) Как я могу справиться с ситуацией, когда база данных отчетов не имеет места на диске, но база данных A все еще запускает триггеры в базу данных отчетов? Было бы хорошо стоять в очереди 2) В связи с вышесказанным, сработает ли это, если я поставлю в очередь триггеры и их данные, которые не смогут сработать в базу данных отчетов (не знаю как, но концептуально ...)? Даже в этом случае система не работает в реальном времени.

Есть ли какие-либо другие опасности / проблемы с обработкой исключений в настройках, подобных этой?

Спасибо

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Такие зависимости на самом деле очень плохи в производстве.На этот раз триггеры и обновление (удаленных) баз данных - верный шанс снизить производительность.Но более важным является вопрос доступности.Приложения, которые зависят от базы данных A, теперь привязаны к доступности базы данных B, потому что, если база данных B недоступна, то триггер не может выполнить свою работу, произойдет сбой, и приложение выдаст ошибки.Так что теперь amdinsitrator (s) базы данных B готов к работе приложений, использующих базу данных A.

Существует много подходов к этой проблеме, самый простой из них - развернуть репликацию транзакций из публикации вбаза данных A с подпиской в ​​базе данных B. Это изолирует две базы данных с точки зрения транзакций, позволяя приложению, зависящему от базы данных A, работать беспрепятственно, когда база данных B недоступна, или просто медленна.

0 голосов
/ 14 июля 2010

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

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

Это не совсем то, что вы хотите.

Вы можете посмотреть на репликацию, если ваша база данных имеет такую ​​же структуру. Обычно, когда я думаю о базе данных отчетов, я думаю о чем-то с другой структурой, оптимизированной для отчетов, а не просто еще одной копией данных, изолированных по соображениям производительности (что хорошо, но в основном это просто использование аппаратного обеспечения в проблема, чтобы перестать сообщать пользователям об ущербе транзакции пользователей).

...