Распределенные транзакции через sql azure и на локальном сервере sql вызывают ошибки

Возможна ли транзакция между локальным экземпляром 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

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

4
0
2 766
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ты не можешь

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

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

Only transactions across databases in SQL DB are supported. Other X/Open XA resource providers and databases outside of SQL DB cannot participate in elastic database transactions. That means that elastic database transactions cannot stretch across on premises SQL Server and Azure SQL Database. For distributed transactions on premises, continue to use MSDTC.

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

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

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

Другие вопросы по теме