Распределенные транзакции через Azure SQL и локальный сервер sql вызывают ошибки - PullRequest
0 голосов
/ 13 сентября 2018

Возможна ли транзакция между локальным экземпляром SQL Server и базой данных SQL Azure.

У меня есть следующие тестовые случаи.

public class TransactionsTest
{
    [Fact]
    public void Test1()
    {
        var premisesDatabaseContext = new OnPremisesDatabaseContext();
        var azureSQLDatabaseContext = new AzureSQLDatabaseContext();

        using (TransactionScope scope = new TransactionScope())
        {
            premisesDatabaseContext.Database.Connection.Open();
            azureSQLDatabaseContext.Database.Connection.Open();

            scope.Complete();
        }
    }

    [Fact]
    public void Test2()
    {
        var premisesDatabaseContext = new OnPremisesDatabaseContext();
        var azureSQLDatabaseContext = new AzureSQLDatabaseContext();

        using (TransactionScope scope = new TransactionScope())
        {
            azureSQLDatabaseContext.Database.Connection.Open();
            premisesDatabaseContext.Database.Connection.Open();

            scope.Complete();
        }
    }
}

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

Вот подробности ошибки.

// TEST 1
System.Reflection.TargetInvocationException: 
Exception has been thrown by the target of an invocation. 
--->
System.NullReferenceException: Object reference not set to an instance of an object.
       at System.Transactions.Transaction.GetPromotedToken()

// TEST 2
System.Transactions.TransactionPromotionException:
There is a promotable enlistment for the transaction which has a PromoterType value that is not recognized by System.Transactions. 
1c742caf-6680-40ea-9c26-6b6846079764

Я хочу знать, возможно ли это сделать. Если это невозможно, каковы альтернативы?

1 Ответ

0 голосов
/ 14 сентября 2018

Нельзя

Базы данных SQL Azure использует Эластичные транзакции .В то время как на локальных серверах используется Microsoft Distributed Transaction Coordinator (MSDTC).

MSDTC не поддерживается в Azure, и согласно документации эластичных транзакций,

Поддерживаются только транзакции между базами данных в БД SQL.Другие поставщики ресурсов X / Open XA и базы данных вне базы данных SQL не могут участвовать в транзакциях эластичной базы данных. Это означает, что транзакции эластичной базы данных не могут распространяться на локальный сервер SQL Server и базу данных SQL Azure .Для распределенных транзакций в помещении продолжайте использовать MSDTC.

  • В локальной среде SQL Server использует MSDTC, который недоступен в базе данных SQL Azure.

  • База данных SQL Azure использует эластичные транзакции,который не будет работать на локальном сервере SQL.

Самым простым решением было бы перенести всю базу данных в Azure или локально.

...