tsql ждут изменения с включенным Read Committed Snapshot
Привет сообщество Stackru,
Позвольте мне попросить вашей помощи, поскольку я столкнулся с критической проблемой.
У нас есть два связанных сервера, и оба являются серверами Microsoft SQL: CRM и DW. Некоторые изменения в системе CRM запускают процедуру мгновенного получения обновлений на сервер DW, и способ, которым она работает, заключается в том, что система CRM вызывает сервер DW для обновления записи. В моем случае обновления, поступающие из системы CRM для серверов CRM и DW sql, называются одновременными, и здесь начинается проблема.
DW-сервер пытается прочитать изменения и получает записи только до начала транзакции. Да, это происходит потому, что CRM-сервер использует:
Читать зафиксированный снимок включен
К сожалению, мы не можем изменить уровень изоляции на сервере CRM sql. Простое объяснение - CRM исходит от стороннего поставщика, и они хотят ограничить нас, чтобы сделать эти возможности.
Есть ли другой способ дождаться подтверждения транзакции и затем прочитать последние данные после подтверждения?
Если не хватает информации, пожалуйста, дайте мне знать, тогда я расскажу больше.
1 ответ
Я не понимаю поток управления здесь, но из первого параграфа вы сказали, что обновления в CRM запускают процесс обновления сервера DW. Итак, я не понимаю, как сервер DW может обновляться до CRM-сервера. Вы заявили, что они вызываются одновременно, но это сведет на нет комментарий о триггере. Вы не хотели бы, чтобы DW получал грязное чтение, поэтому READ COMMITTED SNAPSHOT - хороший выбор, но вы также можете указать любой уровень изоляции на уровне транзакций и переопределить настройку сервера по умолчанию.
Поскольку вы спросили: "Можно ли дождаться подтверждения транзакции и затем прочитать последние данные после подтверждения?", Конечно, это может быть обработано несколькими способами...
- один будет триггер ПОСЛЕ ВСТАВКИ
- другой будет добавить
UPDATE
к DW в блоке кода послеINSERT
заявление, в том же порядке. Здесь вы можете использоватьTRY / CATCH
и, конечно, УСТАНОВИТЕ XACT_ABORT ON, чтобы в случае сбоя откатилась вся транзакция. Помните, что вложенные транзакции не реальны.