Представьте себе ситуацию:
var txn = new DatabaseTransaction();
var entry = txn.Database.Load<Entry>(id);
entry.Token = "123";
txn.Database.Update(entry);
PublishRabbitMqMessage(new EntryUpdatedMessage { ID = entry.ID });
// A bit more of processing
txn.Commit();
Теперь потребитель EntryUpdatedMessage
может получить это сообщение до того, как транзакция txn
будет зафиксирована и, следовательно, не сможет увидеть обновление.
Теперь я знаю, что RabbitMQ действительно поддерживает транзакции сам по себе, но мы не можем их использовать, потому что мы создаем новый IModel
для каждой публикации и имеющий для каждого потока модель действительно громоздка в нашем сценарии (веб-сайт ASP.NET приложение).
Я думал о наличии списка сообщений, которые должны публиковаться при транзакции БД, но это действительно вонючее решение.
Каков правильный способ решения этой проблемы?