TransactionScope поднимается до MSDTC при отправке между очередями?

107
7

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


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


Спасибо.


EDIT: В данный момент все это на моем ноутбуке, поэтому я уверен, что другие машины не задействованы.


Я также хочу добавить, что подтверждаю, что происходит эскалация транзакции путем проверки оснастки "Компонентные службы Windows" (т.е. локального DTC/списка транзакций). Я вижу транзакции, входящие и выходящие из этого экрана, которые, как я полагаю, означает, что транзакция обострилась. Неужели я ошибаюсь в этом?


EDIT 2: Я получаю такое же поведение, когда я просто пишу в одну очередь! то есть.


using (var ts = new TransactionScope())
{
using (var q = new MessageQueue("..."))
{
/* write data */
}

ts.Complete();
}


Я вижу, что DTC используется с вышеуказанным, несмотря на то, что очередь находится на локальной машине.

спросил(а) 2021-01-25T17:45:25+03:00 4 месяца, 2 недели назад
1
Решение
89

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

ответил(а) 2021-01-25T17:45:25+03:00 4 месяца, 2 недели назад
45

Посмотрите эту статью MSDN: Эскалация управления транзакциями


Этот список типичного поведения эскалации, например (блики мои):


Если вы хотите передать транзакцию другому объекту в другой домен приложения (включая через и границы машины) на одном компьютере, инфраструктура System.Transactions автоматически эскалации транзакции, управляемой Microsoft Координатор распределенных транзакций (MSDTC). Эскалация также возникает, если вы зачислите другого надежного менеджера ресурсов. Когда эскалация, транзакция остается управляемой в ее повышенном состоянии до завершение.


Как вы можете видеть, возвышение может произойти не только тогда, когда вы делаете что-то по сети, но даже если вы делаете вещи на одной машине. (Например, у меня недавно были проблемы в случае, когда я обращался к базе данных MS SQL из службы Windows на том же (кластерном) сервере.)


Также это может произойти, если в этом процессе задействована служба WCF.

ответил(а) 2021-01-25T17:45:25+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема