Ищу паттерн для отправки данных
UPD: Попробовал переформулировать, так как 2 голоса для "закрыть"
Подскажите паттерн для подобного.
Записать необходимо в 2 разные таблицы или вообще в 2 разные базы данных. Если запись не произошла во втором условии, то и откатить всё назад и вернуть ошибку.
Либо записывает всё, либо ничего.
public async Task SendAsync(IDefinerResult definerResult)
{
if (definerResult.DefinedLinks.Count != 0)
{
await definedLinkDAL.InsertAsync(definerResult.DefinedLinks);
}
if (definerResult.NotDefinedLinks.Count != 0)
{
await notDefinedLinkDAL.InsertAsync(definerResult.NotDefinedLinks);
}
}
Ответы (2 шт):
В общем, используйте транзакции БД. Это самое простое, что можно сделать. Транзакции в БД разрабатывают много лет, там это продуманный механизм. Если обернуть оба действия в транзакцию, то будет гарантирована атомарность и цельность: либо оба действия будут выполнены, либо оба не выполнены. Состояние, когда выполнено только одно действие, а второе нет, не сможет возникнуть.
Если вы будете реализовать механизм транзакций самостоятельно в своём коде, это потребует много усилий, добиться атомарности и цельности не так то просто.
Подробнее примеры кода работы с транзакциями можно посмотреть по ссылке, которую я выше привёл. И обязательно прочтите там раздел про асинхронность, в частности насчёт этого параметра:
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
P.S. "В две разных БД" будет немного сложнее. По идее, вам нужно будет открывать отдельно транзакции в каждой из БД и в случае проблем одновременно откатывать их. Но в теории может возникнуть ситуация, когда вы закоммитили одну транзакцию, после чего у вас отвалилась связь и вы остались с одной закоммиченной транзакцией и со второй автоматически откаченной.
Есть ещё конечно DbLink
-и, но их очень не любят на промышленных серверах и я не уверен, то можно в одну транзакцию поместить запросы к локальной БД и базе, подключенной через линк. Да и не очень это надёжно тоже.
В общем, лучше, когда в рамках одной БД вся работа происходит.
Задача с распределенными базами сложна потому что возможны проблемы с сетью, ошибки валидации. Собственно появляется потребность как то гарантировать целостность распределенных данных. И появляются паттерны как:
Two-phase commit/XA, SAGA, TCC (Try, Confirm, Cancel), Local Messaging ...