Ищу паттерн для отправки данных

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 шт):

Автор решения: CrazyElf

В общем, используйте транзакции БД. Это самое простое, что можно сделать. Транзакции в БД разрабатывают много лет, там это продуманный механизм. Если обернуть оба действия в транзакцию, то будет гарантирована атомарность и цельность: либо оба действия будут выполнены, либо оба не выполнены. Состояние, когда выполнено только одно действие, а второе нет, не сможет возникнуть.

Если вы будете реализовать механизм транзакций самостоятельно в своём коде, это потребует много усилий, добиться атомарности и цельности не так то просто.

Подробнее примеры кода работы с транзакциями можно посмотреть по ссылке, которую я выше привёл. И обязательно прочтите там раздел про асинхронность, в частности насчёт этого параметра:

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))

P.S. "В две разных БД" будет немного сложнее. По идее, вам нужно будет открывать отдельно транзакции в каждой из БД и в случае проблем одновременно откатывать их. Но в теории может возникнуть ситуация, когда вы закоммитили одну транзакцию, после чего у вас отвалилась связь и вы остались с одной закоммиченной транзакцией и со второй автоматически откаченной.

Есть ещё конечно DbLink-и, но их очень не любят на промышленных серверах и я не уверен, то можно в одну транзакцию поместить запросы к локальной БД и базе, подключенной через линк. Да и не очень это надёжно тоже.

В общем, лучше, когда в рамках одной БД вся работа происходит.

→ Ссылка
Автор решения: Aziz Umarov

Задача с распределенными базами сложна потому что возможны проблемы с сетью, ошибки валидации. Собственно появляется потребность как то гарантировать целостность распределенных данных. И появляются паттерны как:

Two-phase commit/XA, SAGA, TCC (Try, Confirm, Cancel), Local Messaging ...

→ Ссылка