Заглянуть в MSMQ, прежде чем совершать и получать - PullRequest
0 голосов
/ 23 марта 2012

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

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

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

Ответы [ 2 ]

0 голосов
/ 26 марта 2012

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

Так что в псевдокоде это будет выглядеть так:

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 голосов
/ 24 марта 2012
...