2012-03-23 2 views
0

Для моего приложения C# .Net MSMQ (с использованием System.Messaging) я хотел бы выполнить вставку в oracle db в качестве транзакции. Очередь, которую я буду читать, - это локальная приватная очередь, на которую будет писать другая служба.Подглядывание в MSMQ перед фиксацией и получением

Я думал об использовании метода Peek для первого захвата и вставки данных. Если при вставке db не возникнут какие-либо исключения или проблемы, я позвоню «Получить», чтобы удалить сообщение из очереди.

Я знаю, что есть функция TransactionScope, но есть ли какие-либо недостатки для выполнения моей операции, как описано выше?

ответ

0

Да, есть. Кто-то еще теоретически может захватить это сообщение, когда вы вставляете свою базу данных. Предпочтительным методом является использование двух отдельных транзакций, в которых один используется для приема сообщения, а другой для вызова базы данных (если необходимо). И если вызов базы данных не удастся, вы откатите транзакцию приема.

Таким образом, в псевдокоде это будет выглядеть следующим образом:

Initiate receive transaction 

    Receive message // Message will not be displayed in the queue, but it is still there 

    Initiate DB transaction 

     Insert data 

     Commit DB transaction // Message will be removed from the queue 

    Commit receive transaction 

Catch exception 

    Rollback DB transaction 

    Rollback receive transaction // Message will be visible in the queue again 

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

+0

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

+0

Конечно, вы можете реализовать его с помощью peek, а затем получить после вставки db, но если вы используете мой предложенный шаблон, у вас будет более долговечное решение, которое можно было бы легко использовать в других сценариях, а также быть более правильным с архитектурной точки зрения. –

Смежные вопросы