Какие транзакции используются в NServiceBus Sagas?

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

Я спрашиваю, потому что вижу изменения в базе данных (SqlBulkCopy, который обычно записывается во внешнюю транзакцию), происходящие несколько раз. В этом сценарии я получаю доступ к базе данных непосредственно из Saga для «однопоточной» обработки сообщений, но, похоже, это не работает.


person Carl    schedule 03.08.2019    source источник


Ответы (1)


Транспорт служебной шины Azure поддерживает только следующие уровни транспортных транзакций.

  1. SendsAtomicWithReceive (по умолчанию)
  2. ПолучитьТолько
  3. Никто

Он не поддерживает уровень Transaction Scope. Это то, что вы ищете.

Почему это так? Служебная шина Azure не позволяет выполнять какие-либо внешние транзакции. Любая бизнес-операция с данными будет исключена из транзакции обработчика. Чтобы избежать дублирования записи бизнес-данных, вам потребуется реализовать идемпотентность, чтобы гарантировать, что одни и те же бизнес-данные не будут записываться более одного раза при повторной попытке отправки сообщений.

person Sean Feldman    schedule 03.08.2019
comment
Спасибо. У меня сложилось впечатление, что обычные обработчики включают транзакцию, так как при сбое изменения в базе данных откатываются. Или я где-то пропустил важный момент :) - person Carl; 03.08.2019
comment
Вы правы, обработчики участвуют на уровне транзакции, определенном для конечной точки. Уровень зависит от возможностей базового транспорта. Если вы используете транспорт MSMQ или SQL Server, операции с бизнес-данными могут участвовать в той же транзакции, что и транспорт. Это не относится к ASB, ASQ, ASQ и RabbitMQ. - person Sean Feldman; 03.08.2019
comment
Я понимаю. Но если я использую один из транспортов, который не поддерживает транзакции, будет ли обработчик по-прежнему использовать транзакцию, отдельную от транспортной транзакции? И если ответ на этот вопрос положительный, то такое же поведение обработчиков внутри саги? - person Carl; 04.08.2019
comment
Обработчик зависит от уровня транзакции, установленного конечной точкой, который зависит от используемого транспорта. Например, с транспортом ASB вы можете иметь свою собственную транзакцию в обработчике, но она будет несвязанной и полностью зависит от пользователя. Автономные обработчики и обработчики для Sagas следуют этому принципу. Кстати, не рекомендуется выполнять какие-либо действия в обработчиках Saga. Вместо этого вы должны отправлять рабочие запросы автономным обработчикам. - person Sean Feldman; 05.08.2019
comment
Большое спасибо. Действительно помог прояснить некоторые из этого для меня! - person Carl; 05.08.2019