Как связать две транзакции вместе? - PullRequest
2 голосов
/ 20 апреля 2011

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

ЕслиУ меня есть «Транзакция A» в «Базе данных A» и «Транзакция B» в «Базе данных B», как я могу связать две транзакции вместе, чтобы обе успешно или неудачно завершились.

Я не могувыяснить способ сделать это.Откатить «Транзакцию B» легко, если «Транзакция A» не удалась, но если «Транзакция B» не удалась, когда «Транзакция A» уже совершена, я облажался.

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

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

Вам необходимо использовать диспетчер распределенных транзакций (который, в самом простом случае, вы можете сами программировать).

X/OpenXA является наиболее широко используемым стандартом для управления распределенными транзакциями, и все базы данных большой четверки изначально поддерживают его.

1 голос
/ 20 апреля 2011

Существует стандартный процесс базы данных, называемый «Двухфазная фиксация», и большинство коммерческих СУБД так или иначе успешно внедрили 2PC.

Вот некоторые ссылки;

SQL Server: http://msdn.microsoft.com/en-us/library/aa754091(v=bts.10).aspx Oracle: http://download.oracle.com/docs/cd/E14072_01/server.112/e10595/ds_txns003.htm MySQL: http://dev.mysql.com/doc/refman/5.0/en/xa.html

0 голосов
/ 20 апреля 2011
using (TransactionScope scopeExternal = new TransactionScope())
{
    using (TransactionScope scope1 
            = new TransactionScope(TransactionScopeOption.Suppress))
    {
        ... operations for 1st DB
        scope1.Complete();
    }


    using (TransactionScope scope2 
            = new TransactionScope(TransactionScopeOption.Suppress))
    {
        ... operations for 2nd DB
        scope2.Complete();
    }

    scopeExternal.Complete();
}

Если какая-либо транзакция из scope1 или scope2 терпит неудачу, она генерирует исключение, которое препятствует scopeExternal фиксации транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...