Стратегии избежать эскалации транзакции в системе. Транзакции

Похоже, что std::initializer_list еще не (в C ++ 17) удовлетворяет требованиям литерального типа (что является требованием типа переменной constexpr ]. удовлетворить).

Обсуждение того, делает ли он это в C ++ 14, можно найти в этом посте: Почему std::initializer_list не определяется как литеральный тип? , который сам был продолжением после обсуждения Законно ли объявлять объект constexpr initializer_list?

Я сравнил цитаты, приведенные в посте, связанном с C ++ 14 (стандарта C ++ 14), с финальным рабочий проект (стандарта C ++ 17) и они одинаковы. Поэтому нет явного требования, чтобы std::initializer_list был литеральным типом.

Цитаты из окончательного рабочего проекта C ++ 17 (n4659):

[basic.types] /10.5

(10.5) a возможно, cv-квалифицированный тип класса (раздел 12), который имеет все следующие свойства:
(10.5.1) - у него есть тривиальный деструктор,
(10.5.2) - это либо тип замыкания (8.1.5.1), агрегатный тип (11.6.1), либо имеющий хотя бы один конструктор constexpr или шаблон конструктора (возможно, унаследованный (10.3.3) от базового класса), который не является конструктором копирования или перемещения ,
(10.5.3) - если это объединение, то по крайней мере один из его нестатических элементов данных имеет энергонезависимый литеральный тип, а
(10.5.4) - если это не объединение, все его нестатические члены-данные и базовые классы относятся к энергонезависимым литеральным типам .

blockquote>

[initializer_list.syn] / 1

  1. Объект типа initializer_list обеспечивает доступ к массиву объектов типа const E. [ Примечание: Пара указателей или указатель плюс длина были бы очевидными представлениями для initializer_list. initializer_list используется для реализации списков инициализаторов, как указано в 11.6.4. Копирование списка инициализатора не копирует базовые элементы. —Конец примечания]
blockquote>

По этой причине нельзя объявить объект constexpr initializer_list.

7
задан Community 23 May 2017 в 12:26
поделиться

4 ответа

То, что я использовал, является обновлением класса TransactionHelper все команды в TableAdapter для замены соединения и транзакции с теми от TableAdapter, который инициирует транзакцию. Можно найти некоторый код, который делает это, которое можно адаптировать по мере необходимости, на блоге Scott Lanford, CodeExperiment. У Ryan Whitaker есть аналогичный подход.

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

2
ответ дан 7 December 2019 в 18:46
поделиться

Я рекомендовал бы писать класс обертки для того, чтобы управлять подключениями, транзакциями, объектами команды, это - целые вещи DB. Это - своего рода очень легкий nHibernate. Этот класс предоставил бы методы для executeStatement (...), executeQuery (...), addParameter (...), startTransaction (...) и так далее.

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

Вы получите некоторые дополнительные функции от этого подхода, поскольку Вы централизуете весь свой материал персистентности:

  • легко зарегистрируйте все операторы для отладки, тестирования производительности
  • автоматическая логика повторной попытки на блокировке/сетевых проблемах
  • более простой переключатель поставщика БД
  • в основном некоторые вещи Вы становитесь с платформами персистентности как nHibernate, но более легкий и не настолько сложными
0
ответ дан 7 December 2019 в 18:46
поделиться

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

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

Как casper указанный, избегая DTC могло бы быть преждевременным, хотя это - значительный вес. Вы могли реализовать свои соединения с помощью статических фабрик так, чтобы просто возвратили новые объекты, затем если Вы решаете, что у Вас есть проблема, Вы могли бы реализовать механизм, который может сохранить транзакции в TLS (или httpcontext если Ваш в ASP). И не должны изменить любой код.

Этот вопрос на самом деле задали и ответили, но я не могу найти его, когда я сделаю я обновлю это.

0
ответ дан 7 December 2019 в 18:46
поделиться
Другие вопросы по тегам:

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