Transações distribuídas entre bancos de dados na nuvemDistributed transactions across cloud databases

As transações de banco de dados elástico para Banco de dados SQL (BD SQL) do Azure permitem que você execute transações que abranjam vários bancos de dados no BD SQL.Elastic database transactions for Azure SQL Database (SQL DB) allow you to run transactions that span several databases in SQL DB. As transações de banco de dados elástico do BD SQL estão disponíveis para aplicativos .NET usando ADO .NET e se integram à experiência de programação conhecida usando as classes System.Transaction .Elastic database transactions for SQL DB are available for .NET applications using ADO .NET and integrate with the familiar programming experience using the System.Transaction classes. Para obter a biblioteca, confira .NET Framework 4.6.1 (Web Installer).To get the library, see .NET Framework 4.6.1 (Web Installer).

No local, esse cenário normalmente exigiria a execução do recurso MSDTC (Coordenador de Transações Distribuídas da Microsoft).On premises, such a scenario usually required running Microsoft Distributed Transaction Coordinator (MSDTC). Como o MSDTC não está disponível para aplicativos de plataforma como serviço no Azure, a capacidade de coordenar transações distribuídas agora foi diretamente integrada ao BD SQL.Since MSDTC is not available for Platform-as-a-Service application in Azure, the ability to coordinate distributed transactions has now been directly integrated into SQL DB. Os aplicativos podem se conectar a qualquer Banco de Dados SQL para iniciar transações distribuídas, e um dos bancos de dados coordenará de forma transparente a transação distribuída, como mostra a figura a seguir.Applications can connect to any SQL Database to launch distributed transactions, and one of the databases will transparently coordinate the distributed transaction, as shown in the following figure.

Transações distribuídas com o Banco de Dados SQL do Azure usando transações de banco de dados elásticoDistributed transactions with Azure SQL Database using elastic database transactions

Cenários comunsCommon scenarios

As transações de banco de dados elástico do BD SQL permitem que os aplicativos façam alterações atômicas nos dados armazenados em vários Bancos de Dados SQL diferentes.Elastic database transactions for SQL DB enable applications to make atomic changes to data stored in several different SQL Databases. A visualização se concentra nas experiências de desenvolvimento do lado do cliente em C# e .NET.The preview focuses on client-side development experiences in C# and .NET. Há planos para uma experiência do lado do servidor usando o T-SQL para um momento posterior.A server-side experience using T-SQL is planned for a later time.
As transações de banco de dados elástico têm como objetivo os seguintes cenários:Elastic database transactions targets the following scenarios:

  • Aplicativos de vários bancos de dados no Azure: Com esse cenário, os dados são particionados verticalmente em vários bancos de dados no BD SQL, de modo que os diferentes tipos de dados residam em bancos de dados diferentes.Multi-database applications in Azure: With this scenario, data is vertically partitioned across several databases in SQL DB such that different kinds of data reside on different databases. Algumas operações exigem alterações nos dados, que são mantidos em dois ou mais bancos de dados.Some operations require changes to data which is kept in two or more databases. O aplicativo usa transações de banco de dados elástico para coordenar as alterações nos bancos de dados e garantir a atomicidade.The application uses elastic database transactions to coordinate the changes across databases and ensure atomicity.
  • Aplicativos de banco de dados compartilhados no Azure: Com esse cenário, a camada de dados usa a biblioteca de cliente do Banco de Dados Elástico ou a autofragmentação para particionar horizontalmente os dados em vários bancos de dados no Banco de Dados SQL.Sharded database applications in Azure: With this scenario, the data tier uses the Elastic Database client library or self-sharding to horizontally partition the data across many databases in SQL DB. Um caso de uso importante é a necessidade de realizar mudanças atômicas em um aplicativo multilocatário fragmentado quando as alterações se estendem aos locatários.One prominent use case is the need to perform atomic changes for a sharded multi-tenant application when changes span tenants. Pense, por exemplo, em uma transferência de um locatário para outro, ambos residentes em bancos de dados diferentes.Think for instance of a transfer from one tenant to another, both residing on different databases. Um segundo caso é a fragmentação refinada para acomodar as necessidades de capacidade de um locatário grande, o que, por sua vez, geralmente implica na necessidade de extensão de algumas operações atômicas em vários bancos de dados usados para o mesmo locatário.A second case is fine-grained sharding to accommodate capacity needs for a large tenant which in turn typically implies that some atomic operations needs to stretch across several databases used for the same tenant. Um terceiro caso são as atualizações atômicas de dados de referência que são replicados nos bancos de dados.A third case is atomic updates to reference data that are replicated across databases. As operações atômicas e transacionadas, juntamente com estas linhas, agora podem ser coordenadas em vários bancos de dados usando a visualização.Atomic, transacted, operations along these lines can now be coordinated across several databases using the preview. As transações de banco de dados elástico usam o protocolo 2PC para garantir a atomicidade das transações nos bancos de dados.Elastic database transactions use two-phase commit to ensure transaction atomicity across databases. É uma boa opção para as transações que envolvem menos de 100 bancos de dados por vez em uma única transação.It is a good fit for transactions that involve less than 100 databases at a time within a single transaction. Esses limites não são impostos, mas o desempenho e as taxas de êxito das transações de banco de dados elástico provavelmente serão prejudicados se eles forem ultrapassados.These limits are not enforced, but one should expect performance and success rates for elastic database transactions to suffer when exceeding these limits.

Instalação e migraçãoInstallation and migration

Os recursos das transações de banco de dados elástico no BD SQL são fornecidos por meio de atualizações das bibliotecas .NET System.Data.dll e System.Transactions.dll.The capabilities for elastic database transactions in SQL DB are provided through updates to the .NET libraries System.Data.dll and System.Transactions.dll. As DLLs garantem que o protocolo 2PC seja usado quando necessário para garantir a atomicidade.The DLLs ensure that two-phase commit is used where necessary to ensure atomicity. Para começar a desenvolver aplicativos usando as transações de banco de dados elástico, instale o .NET Framework 4.6.1 ou uma versão posterior.To start developing applications using elastic database transactions, install .NET Framework 4.6.1 or a later version. Quando executadas em uma versão anterior do .NET Framework, as transações não serão promovidas a uma transação distribuída, e uma exceção será gerada.When running on an earlier version of the .NET framework, transactions will fail to promote to a distributed transaction and an exception will be raised.

Após a instalação, você pode usar as APIs de transação distribuída em System.Transactions com conexões ao BD SQL.After installation, you can use the distributed transaction APIs in System.Transactions with connections to SQL DB. Se você já tiver aplicativos do MSDTC usando essas APIs, basta recompilar os aplicativos existentes para o .NET 4.6 depois de instalar o .NET Framework 4.6.1.If you have existing MSDTC applications using these APIs, simply rebuild your existing applications for .NET 4.6 after installing the 4.6.1 Framework. Se seus projetos visam o .NET 4.6, eles usarão automaticamente as DLLs atualizadas da nova versão do Framework, e as chamadas à API de transação distribuída em conjunto com as conexões ao BD SQL passarão a funcionar.If your projects target .NET 4.6, they will automatically use the updated DLLs from the new Framework version and distributed transaction API calls in combination with connections to SQL DB will now succeed.

Lembre-se de que as transações de banco de dados elástico não requerem a instalação do MSDTC.Remember that elastic database transactions do not require installing MSDTC. Em vez disso, as transações de banco de dados elástico são gerenciadas diretamente pelo BD SQL, dentro dele.Instead, elastic database transactions are directly managed by and within SQL DB. Isso simplifica significativamente os cenários de nuvem, já que a implantação de um MSDTC não é necessária para o uso das transações distribuídas com o BD SQL.This significantly simplifies cloud scenarios since a deployment of MSDTC is not necessary to use distributed transactions with SQL DB. A Seção 4 explica detalhadamente como implantar as transações de banco de dados elástico e o .NET Framework necessário juntamente com seus aplicativos em nuvem no Azure.Section 4 explains in more detail how to deploy elastic database transactions and the required .NET framework together with your cloud applications to Azure.

Experiência de desenvolvimentoDevelopment experience

Aplicativos de vários bancos de dadosMulti-database applications

O exemplo de código a seguir usa a experiência de programação conhecida com o .NET System.Transactions.The following sample code uses the familiar programming experience with .NET System.Transactions. A classe TransactionScope estabelece uma transação de ambiente no .NET.The TransactionScope class establishes an ambient transaction in .NET. Uma “transação de ambiente” é aquela que reside no thread atual. Todas as conexões abertas no TransactionScope participam da transação.(An “ambient transaction” is one that lives in the current thread.) All connections opened within the TransactionScope participate in the transaction. Se diferentes bancos de dados participarem, a transação será elevada automaticamente a uma transação distribuída.If different databases participate, the transaction is automatically elevated to a distributed transaction. O resultado da transação é controlado pela definição do escopo a concluir para indicar uma confirmação.The outcome of the transaction is controlled by setting the scope to complete to indicate a commit.

using (var scope = new TransactionScope())
{
    using (var conn1 = new SqlConnection(connStrDb1))
    {
        conn1.Open();
        SqlCommand cmd1 = conn1.CreateCommand();
        cmd1.CommandText = string.Format("insert into T1 values(1)");
        cmd1.ExecuteNonQuery();
    }

    using (var conn2 = new SqlConnection(connStrDb2))
    {
        conn2.Open();
        var cmd2 = conn2.CreateCommand();
        cmd2.CommandText = string.Format("insert into T2 values(2)");
        cmd2.ExecuteNonQuery();
    }

    scope.Complete();
}

Aplicativos de banco de dados fragmentadoSharded database applications

As transações de banco de dados elástico do BD SQL também oferecem suporte a coordenação de transações distribuídas, em que você usa o método OpenConnectionForKey da biblioteca do cliente de banco de dados elástico para abrir conexões para uma camada de dados escalados horizontalmente.Elastic database transactions for SQL DB also support coordinating distributed transactions where you use the OpenConnectionForKey method of the elastic database client library to open connections for a scaled out data tier. Considere os casos em que você precisa garantir a consistência transacional das alterações em vários valores-chave de fragmentação diferentes.Consider cases where you need to guarantee transactional consistency for changes across several different sharding key values. As conexões com os fragmentos que hospedam os diferentes valores-chave de fragmentação são intermediadas usando o OpenConnectionForKey.Connections to the shards hosting the different sharding key values are brokered using OpenConnectionForKey. Em geral, as conexões podem ocorrer para diferentes fragmentos, de modo que para assegurar as garantias transacionais seja necessária uma transação distribuída.In the general case, the connections can be to different shards such that ensuring transactional guarantees requires a distributed transaction. O exemplo de código a seguir ilustra essa abordagem.The following code sample illustrates this approach. Ele pressupõe que uma variável chamada shardmap seja usada para representar um mapa do fragmento na biblioteca do cliente de banco de dados elástico:It assumes that a variable called shardmap is used to represent a shard map from the elastic database client library:

using (var scope = new TransactionScope())
{
    using (var conn1 = shardmap.OpenConnectionForKey(tenantId1, credentialsStr))
    {
        conn1.Open();
        SqlCommand cmd1 = conn1.CreateCommand();
        cmd1.CommandText = string.Format("insert into T1 values(1)");
        cmd1.ExecuteNonQuery();
    }

    using (var conn2 = shardmap.OpenConnectionForKey(tenantId2, credentialsStr))
    {
        conn2.Open();
        var cmd2 = conn2.CreateCommand();
        cmd2.CommandText = string.Format("insert into T1 values(2)");
        cmd2.ExecuteNonQuery();
    }

    scope.Complete();
}

Instalação do .NET para os Serviços de Nuvem do Azure.NET installation for Azure Cloud Services

O Azure fornece várias ofertas para hospedar aplicativos .NET.Azure provides several offerings to host .NET applications. Uma comparação entre as diferentes ofertas está disponível em Comparação entre o Serviço de Aplicativo do Azure, os Serviços de Nuvem e as Máquinas Virtuais.A comparison of the different offerings is available in Azure App Service, Cloud Services, and Virtual Machines comparison. Se o SO convidado da oferta for inferior ao .NET 4.6.1 exigido para transações elásticas, será necessário atualizar o SO para 4.6.1.If the guest OS of the offering is smaller than .NET 4.6.1 required for elastic transactions, you need to upgrade the guest OS to 4.6.1.

Para os Serviços de Aplicativos do Azure, não há suporte para atualizações para o SO convidado.For Azure App Services, upgrades to the guest OS are currently not supported. Para as Máquinas virtuais do Azure, basta fazer logon na VM e executar o instalador do .NET Framework mais recente.For Azure Virtual Machines, simply log into the VM and run the installer for the latest .NET framework. Para os Serviços de Nuvem do Azure, você precisará incluir a instalação de uma versão mais recente do .NET em tarefas de inicialização da sua implantação.For Azure Cloud Services, you need to include the installation of a newer .NET version into the startup tasks of your deployment. Os conceitos e as etapas estão documentados em Instalar o .NET em uma Função do Serviço de Nuvem.The concepts and steps are documented in Install .NET on a Cloud Service Role.

Observe que o instalador do .NET 4.6.1 pode exigir mais armazenamento temporário durante o processo de inicialização nos Serviços de Nuvem do Azure que o instalador do .NET 4.6.Note that the installer for .NET 4.6.1 may require more temporary storage during the bootstrapping process on Azure cloud services than the installer for .NET 4.6. Para garantir uma instalação bem-sucedida, você precisa aumentar o armazenamento temporário para o serviço de nuvem do Azure no seu arquivo ServiceDefinition.csdef na seção LocalResources e nas configurações do ambiente de sua tarefa de inicialização, conforme mostrado no exemplo a seguir:To ensure a successful installation, you need to increase temporary storage for your Azure cloud service in your ServiceDefinition.csdef file in the LocalResources section and the environment settings of your startup task, as shown in the following sample:

<LocalResources>
...
    <LocalStorage name="TEMP" sizeInMB="5000" cleanOnRoleRecycle="false" />
    <LocalStorage name="TMP" sizeInMB="5000" cleanOnRoleRecycle="false" />
</LocalResources>
<Startup>
    <Task commandLine="install.cmd" executionContext="elevated" taskType="simple">
        <Environment>
    ...
            <Variable name="TEMP">
                <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='TEMP']/@path" />
            </Variable>
            <Variable name="TMP">
                <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='TMP']/@path" />
            </Variable>
        </Environment>
    </Task>
</Startup>

Transações entre vários servidoresTransactions across multiple servers

Observação

Este artigo foi atualizado para usar o novo módulo Az do Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Você ainda pode usar o módulo AzureRM, que continuará a receber as correções de bugs até pelo menos dezembro de 2020.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Para saber mais sobre o novo módulo Az e a compatibilidade com o AzureRM, confira Apresentação do novo módulo Az do Azure PowerShell.To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Para obter instruções de instalação do módulo Az, confira Instalar o Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

Importante

O módulo do PowerShell do Azure Resource Manager ainda é compatível com o banco de dados SQL, mas todo o desenvolvimento futuro é para o módulo Az.Sql.The PowerShell Azure Resource Manager module is still supported by Azure SQL Database, but all future development is for the Az.Sql module. Para esses cmdlets, consulte azurerm. SQL.For these cmdlets, see AzureRM.Sql. Os argumentos para os comandos no módulo Az e nos módulos AzureRm são substancialmente idênticos.The arguments for the commands in the Az module and in the AzureRm modules are substantially identical.

Há suporte para transações de Banco de Dados Elástico entre diferentes servidores do Banco de Dados SQL no Banco de Dados SQL do Azure.Elastic database transactions are supported across different SQL Database servers in Azure SQL Database. Quando as transações cruzam os limites do servidor do Banco de Dados SQL, os servidores participantes precisam primeiro serem inseridos em uma relação de comunicação comum.When transactions cross SQL Database server boundaries, the participating servers first need to be entered into a mutual communication relationship. Após a relação de comunicação ser estabelecida, qualquer banco de dados em qualquer um dos dois servidores poderá participar de transações elásticas com bancos de dados do outro servidor.Once the communication relationship has been established, any database in any of the two servers can participate in elastic transactions with databases from the other server. Com transações abrangendo mais de dois servidores do Banco de Dados SQL, uma relação de comunicação deve estar em vigor para qualquer par de servidores do Banco de Dados SQL.With transactions spanning more than two SQL Database servers, a communication relationship needs to be in place for any pair of SQL Database servers.

Use os cmdlets do PowerShell a seguir para gerenciar as relações de comunicação entre servidores para transações de Banco de Dados Elástico:Use the following PowerShell cmdlets to manage cross-server communication relationships for elastic database transactions:

  • New-AzSqlServerCommunicationLink: Use esse cmdlet para criar uma nova relação de comunicação entre dois servidores do Banco de Dados SQL no Banco de Dados SQL do Azure.New-AzSqlServerCommunicationLink: Use this cmdlet to create a new communication relationship between two SQL Database servers in Azure SQL Database. A relação é simétrica, o que significa que ambos os servidores podem iniciar transações com outro.The relationship is symmetric which means both servers can initiate transactions with the other server.
  • Get-AzSqlServerCommunicationLink: Use esse cmdlet para recuperar as relações de comunicação existentes e suas propriedades.Get-AzSqlServerCommunicationLink: Use this cmdlet to retrieve existing communication relationships and their properties.
  • Remove-AzSqlServerCommunicationLink: Use esse cmdlet para remover as relações de comunicação existentes.Remove-AzSqlServerCommunicationLink: Use this cmdlet to remove an existing communication relationship.

Monitorando o status da transaçãoMonitoring transaction status

Use as DMVs (Exibições de Gerenciamento Dinâmico) no BD SQL para monitorar o status e o progresso das transações de banco de dados elástico em andamento.Use Dynamic Management Views (DMVs) in SQL DB to monitor status and progress of your ongoing elastic database transactions. Todas as DMVs relacionadas com transações são relevantes para as transações distribuídas no BD SQL.All DMVs related to transactions are relevant for distributed transactions in SQL DB. Você pode encontrar a lista correspondente de DMVs aqui: Exibições de Gerenciamento Dinâmico Relacionadas à Transação e Funções (Transact-SQL).You can find the corresponding list of DMVs here: Transaction Related Dynamic Management Views and Functions (Transact-SQL).

Estas DMVs são especialmente úteis:These DMVs are particularly useful:

  • sys.dm_tran_active_transactions: Lista as transações atualmente ativas e seu status.sys.dm_tran_active_transactions: Lists currently active transactions and their status. A coluna UOW (Unidade de Trabalho) pode identificar as diferentes transações filho que pertencem à mesma transação distribuída.The UOW (Unit Of Work) column can identify the different child transactions that belong to the same distributed transaction. Todas as transações dentro da mesma transação distribuída carregam o mesmo valor UOW.All transactions within the same distributed transaction carry the same UOW value. Para saber mais, confira a documentação do DMV.See the DMV documentation for more information.
  • sys.dm_tran_database_transactions: Fornece informações adicionais sobre as transações, como a colocação da transação no log.sys.dm_tran_database_transactions: Provides additional information about transactions, such as placement of the transaction in the log. Para saber mais, confira a documentação do DMV.See the DMV documentation for more information.
  • sys.dm_tran_locks: Fornece informações sobre os bloqueios que são atualmente mantidos por transações em andamento.sys.dm_tran_locks: Provides information about the locks that are currently held by ongoing transactions. Para saber mais, confira a documentação do DMV.See the DMV documentation for more information.

LimitaçõesLimitations

As seguintes limitações se aplicam atualmente para as transações de banco de dados elástico no BD SQL:The following limitations currently apply to elastic database transactions in SQL DB:

  • Há suporte somente para transações em bancos de dados no BD SQL.Only transactions across databases in SQL DB are supported. Outros provedores de recursos X/Open XA e bancos de dados fora do BD SQL não podem participar de transações de banco de dados elástico.Other X/Open XA resource providers and databases outside of SQL DB cannot participate in elastic database transactions. Isso significa que as transações de banco de dados elástico não podem se estender para o SQL Server local e o Banco de Dados SQL do Azure.That means that elastic database transactions cannot stretch across on premises SQL Server and Azure SQL Database. Para transações distribuídas no local, continue a usar o MSDTC.For distributed transactions on premises, continue to use MSDTC.
  • Há suporte somente para transações coordenadas pelo cliente a partir de um aplicativo .NET.Only client-coordinated transactions from a .NET application are supported. Há planos para suporte do lado do servidor para o T-SQL, como INICIAR TRANSAÇÃO DISTRIBUÍDA, mas ainda não está disponível.Server-side support for T-SQL such as BEGIN DISTRIBUTED TRANSACTION is planned, but not yet available.
  • Não há suporte para transações em serviços WCF.Transactions across WCF services are not supported. Por exemplo, você tem um método de serviço WCF que executa uma transação.For example, you have a WCF service method that executes a transaction. Colocar a chamada dentro de um escopo de transação falhará como System.ServiceModel.ProtocolException.Enclosing the call within a transaction scope will fail as a System.ServiceModel.ProtocolException.

Próximas etapasNext steps

Em caso de dúvidas, entre em contato conosco pelo fórum do Banco de Dados SQL e, para solicitações de recursos, adicione-as ao fórum de comentários sobre o Banco de Dados SQL.For questions, please reach out to us on the SQL Database forum and for feature requests, please add them to the SQL Database feedback forum.