Как выполнять работу после фиксации транзакции

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

Проблема заключается в том, что, поскольку работа с БД выполняется в транзакции, клиенты, получающие сообщение веб-сокета, могут попытаться прочитать данные до того, как транзакция будет зафиксирована, что приведет к возврату устаревших данных.

Поскольку весь обработчик работает в области транзакции, невозможно выполнить эту работу только в конце транзакции. Есть ли крючок, позволяющий мне выполнять работу после фиксации транзакции?

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

Как вы думаете, какой подход лучше всего подходит для решения этой проблемы? Отключение транзакций не вариант.

Похожая проблема может возникнуть, например, при попытке отправить письмо. т. е. я хочу, чтобы почта отправлялась только после фиксации транзакции.


person Ross Jones    schedule 12.07.2013    source источник


Ответы (1)


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

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

person Damien_The_Unbeliever    schedule 12.07.2013