Реализация транзакций по нескольким базам данных

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

Основы здесь -

По сути, вы делаете:

  1. Создайте класс, производный от std::locale::facet. Небольшой недостаток в том, что вам понадобится модуль компиляции где-нибудь для хранения его идентификатора. Давайте назовем это MyPrettyVectorPrinter. Вы, вероятно, дадите ему лучшее имя, а также создадите его для пары и карты.
  2. В своей функции потока вы проверяете std::has_facet< MyPrettyVectorPrinter >
  3. Если это возвращает true, извлеките его с помощью std::use_facet< MyPrettyVectorPrinter >( os.getloc() )
  4. У ваших фасетных объектов будут значения для разделителей, и вы можете их читать , Если фасет не найден, ваша функция печати (operator<<) предоставляет функции по умолчанию. Обратите внимание, что вы можете сделать то же самое для чтения вектора.

Мне нравится этот метод, потому что вы можете использовать печать по умолчанию, но при этом можете использовать пользовательское переопределение.

Минусам нужна библиотека для вашего фасета, если она используется в нескольких проектах (поэтому не может быть только заголовками), а также тот факт, что вам нужно остерегаться затрат на создание нового объекта локали.

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

6
задан Jesse 28 August 2013 в 23:44
поделиться

4 ответа

Используйте класс TransactionScope следующим образом:

using (TransactionScope ts = new TransactionScope())
{
    //all db code here

    // if an error occurs jump out of the using block and it will dispose and rollback

    ts.Complete();
}

Класс TransactionScope при необходимости автоматически преобразуется в распределенную транзакцию.

12
ответ дан 8 December 2019 в 18:40
поделиться

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

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

0
ответ дан 8 December 2019 в 18:40
поделиться

Если вы хотите выполнить транзакцию в нескольких экземплярах SQL Server, ознакомьтесь с документацией Координатора распределенных транзакций Microsoft

0
ответ дан 8 December 2019 в 18:40
поделиться

Использование transactionScope - вот ответ. Он работает даже с разными СУБД !!!

Транзакции в нескольких базах данных

1
ответ дан 8 December 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: