Вопрос по database, transactions, sql-server, .net – Реализация транзакций через несколько баз данных

6

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

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

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() (см. комментарий). Есть ли лучший способ сделать это?

Привет, у меня та же проблема ... И мои базы данных могут быть Mysql и Sql Server ... Будет ли это работать с TransactionScope? David Espart
Примечание: это не фактический код. я изменил это значительно для ясности Umair Ahmed

Ваш Ответ

4   ответа
0

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

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

12

Использовать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 автоматически преобразуется в распределенную транзакцию.

@ Jesse, я думаю, что для транзакций между базами данных, даже в последней версии .Net, потребуется Microsoft Microsoft Distributed Transaction Coordinator. Я не могу понять, почему вы сказали, что в этом не будет необходимости?
@ Сунил Вы совершенно правы. В то время это было недоразумение с моей стороны .NET Framework. Я продолжу удалять ошибочный комментарий. Спасибо, что уведомили меня! знак равно
0

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

1

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

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

Похожие вопросы