Реализация транзакций через несколько баз данных

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

Вот что у меня сейчас есть:

try
{
    db[1].begintransaction();
    db[1].ExecuteNonQuery();

    db[2].begintransaction();
    db[2].ExecuteNonQuery();

    ...

    db[N].begintransaction();
    db[N].ExecuteNonQuery();

    // will execute only if no exception raised during the process
    for (int a = 0; a < N; a++)
    {
        db[a].Commit();// what if there is an error/exception here
    }
}
catch
{
    for (int a = 0; a < N; a++)
    {
        db[a].RollBack();
    }
}

Проблема в том, что вышеперечисленное ужасно потерпит неудачу, если исключение произойдет во времяCommit() (см. комментарий). Есть ли лучший способ сделать это?

Ответы на вопрос(4)

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

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

ИспользоватьTransactionScope класс как это:

using (TransactionScope ts = new TransactionScope())
{
    //all db code here

    // if an error occurs jump out of the using block and it will dispose and rollback

    ts.Complete();
}

При необходимости класс TransactionScope автоматически преобразуется в распределенную транзакцию.

Если вы хотите выполнить транзакцию в нескольких экземплярах SQL Server, посмотрите наКоординатор распределенных транзакций Microsoft документация

Использование TransactionScope является ответом. Он даже работает с разными СУБД !!!

Транзакции через несколько баз данных

ВАШ ОТВЕТ НА ВОПРОС