Как TransactionScope гарантирует целостность данных в нескольких базах данных? - PullRequest
4 голосов
/ 08 марта 2010

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

Edit:

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

Спасибо, Бас

Пример:

    using(var scope=new TransactionScope())
    {
        using (var context = new FirstEntities())
        {
            context.AddToSomethingSet(new Something());
            context.SaveChanges();
        }

        using (var context = new SecondEntities())
        {
            context.AddToSomethingElseSet(new SomethingElse());
            context.SaveChanges();
        }

        scope.Complete();
    }

Ответы [ 2 ]

6 голосов
/ 08 марта 2010

Он передает его Координатору распределенных транзакций (msdtc), если обнаруживает несколько баз данных, которые используют каждую область как часть двухфазного принятия. Каждая область голосует за фиксацию , и, следовательно, мы получаем свойства ACID, но распределяем по базам данных. Он также может быть интегрирован с TxF, TxR. Вы должны быть в состоянии использовать это так, как вы описываете.

Две базы данных согласованы, так как к ним подключена распределенная транзакция COM +, запущенная под MTC, транзакции базы данных.

Если одна база данных проголосует за принятие (например, выполнив (: TransactionScope) .Commit ()), «it» сообщает DTC, что она проголосовала за принятие. Когда все базы данных сделали это, у них есть список изменений. Поскольку транзакции базы данных теперь не блокируются и не конфликтуют с другими транзакциями (например, с помощью алгоритма справедливости, который опережает одну транзакцию), все операции для каждой базы данных находятся в журнале транзакций. Если система теряет питание, когда еще не завершена фиксация для одной базы данных, но для другой, в журнале транзакций записывается, что все ресурсы проголосовали за фиксацию, поэтому логическое следствие того, что фиксация должна завершиться неудачей Следовательно, в следующий раз, когда база данных, которая не смогла зафиксировать, загружается, она завершит транзакции, оставленные в этом неопределенном состоянии.

2 голосов
/ 08 марта 2010

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

В какой-то момент обе базы данных должны сказали применить свои изменения. Давайте говорят, что после отключения электроэнергии говоря первым БД применить, затем базы данных не синхронизированы. Или я что-то упустил?

Вы нет. Я думаю, что это известно как проблема генералов. Это невозможно предотвратить. Однако окна сбоя довольно маленькие.

...