.NET: как отключить продвижение в Системе. Транзакции?

Стандартный вектор НЕ делает проверки диапазона по умолчанию.

т.е. оператор [] не делает проверки принадлежности к диапазону.

метод в () похож [], но действительно делает проверку принадлежности к диапазону.
Это выдаст исключение на из диапазона.

станд.:: вектор:: в ()
станд.:: вектор:: оператор [] ()

Другие примечания: Почему vector< Pointers>?
у Вас может довольно легко быть vector< Object>. теперь нет никакой потребности волноваться об управлении памятью (т.е. утечки).

std::vector >   m;

Примечание: vector< bool> перегружается и не очень эффективный (т.е. эта структура была оптимизирована для размера не скорость) (Это - что-то, что теперь распознано как, вероятно, ошибка комитетом по стандартам).

, Если Вы знаете размер матрицы во время компиляции, Вы могли бы использовать станд.:: bitset?

std::vector >    m;

или если это - время выполнения, определил повышение использования:: dynamic_bitset

std::vector  m;

Все вышеупомянутое позволит Вам делать:

m[6][3] = true;

6
задан andreas 9 October 2009 в 08:40
поделиться

2 ответа

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

Чтобы избежать эскалации управления транзакциями , вам необходимо:

  • иметь SQL Server 2005 или выше как ваша база данных

  • , если SQL Server 2005, используйте только одно соединение с базой данных для время жизни транзакции. (SQL Server 2008 позволит вам использовать несколько соединений в рамках транзакции без продвижения по службе.)

  • доступ только к одной базе данных

  • не передавать вашу транзакцию через домены приложений


Правила должны гарантировать свойства ACID транзакции.

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

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

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

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

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

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

Я не думаю, что существует прямой способ отключить продвижение. Возможно, вы захотите посмотреть на ситуации, в которых транзакция продвигается. Юваль Лоуи написал отличный технический документ (также можно загрузить здесь ), посвященный System.Transactions. Он подробно описывает правила продвижения.

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

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