Verteilte Transaktionen über ClouddatenbankenDistributed transactions across cloud databases

BETRIFFT: jaAzure SQL-Datenbank APPLIES TO: yesAzure SQL Database

Mithilfe elastischer Datenbanktransaktionen für Azure SQL-Datenbank können Sie übergreifende Transaktionen für mehrere Datenbanken in Azure SQL-Datenbank ausführen.Elastic database transactions for Azure SQL Database allow you to run transactions that span several databases in SQL Database. Elastische Datenbanktransaktionen für Azure SQL-Datenbank stehen für .NET-Anwendungen über ADO.NET zur Verfügung und lassen sich mithilfe der Klassen vom Typ System.Transaction in die vertraute Programmierumgebung integrieren.Elastic database transactions for SQL Database are available for .NET applications using ADO .NET and integrate with the familiar programming experience using the System.Transaction classes. Informationen zum Abrufen der Bibliothek finden Sie unter .NET Framework 4.6.1 (Webinstaller).To get the library, see .NET Framework 4.6.1 (Web Installer).

Lokal muss für ein solches Szenario normalerweise MSDTC (Microsoft Distributed Transaction Coordinator) ausgeführt werden.On premises, such a scenario usually requires running Microsoft Distributed Transaction Coordinator (MSDTC). Da MSDTC in Azure nicht als Platform-as-a-Service-Anwendung verfügbar ist, wurde die Koordinierung verteilter Transaktionen nun direkt in Azure SQL-Datenbank integriert.Since MSDTC isn't available for Platform-as-a-Service application in Azure, the ability to coordinate distributed transactions has now been directly integrated into SQL Database. Anwendungen können eine Verbindung mit einer beliebigen SQL-Datenbank-Instanz herstellen, um verteilte Transaktionen zu starten, und eine der Datenbanken koordiniert auf transparente Weise die verteilte Transaktion, wie in der folgenden Abbildung zu sehen.Applications can connect to any database in SQL Database to launch distributed transactions, and one of the databases will transparently coordinate the distributed transaction, as shown in the following figure.

Verteilte Transaktionen mit Azure SQL-Datenbank unter Verwendung elastischer DatenbanktransaktionenDistributed transactions with Azure SQL Database using elastic database transactions

Häufige SzenariosCommon scenarios

Mit elastischen Datenbanktransaktionen für Azure SQL-Datenbank können Anwendungen unteilbare Änderungen an Daten vornehmen, die in mehreren verschiedenen SQL-Datenbank-Instanzen gespeichert sind.Elastic database transactions for SQL Database enable applications to make atomic changes to data stored in several different databases in SQL Database. Die Vorschau konzentriert sich auf clientseitige Entwicklungsoptionen in C# und .NET.The preview focuses on client-side development experiences in C# and .NET. Eine serverseitige Option mit T-SQL ist für einen späteren Zeitpunkt geplant.A server-side experience using T-SQL is planned for a later time.
Elastische Datenbanktransaktionen eignen sich für folgende Szenarien:Elastic database transactions target the following scenarios:

  • Multidatenbankanwendungen in Azure: In diesem Szenario werden die Daten vertikal so auf mehrere Datenbanken in Azure SQL-Datenbank verteilt, dass sich unterschiedliche Datentypen in unterschiedlichen Datenbanken befinden.Multi-database applications in Azure: With this scenario, data is vertically partitioned across several databases in SQL Database such that different kinds of data reside on different databases. Einige Vorgänge erfordern Änderungen an Daten in mehreren Datenbanken.Some operations require changes to data, which is kept in two or more databases. Die Anwendung verwendet elastische Datenbanktransaktionen, um die datenbankübergreifenden Änderungen zu koordinieren und die Unteilbarkeit sicherzustellen.The application uses elastic database transactions to coordinate the changes across databases and ensure atomicity.
  • Partitionierte Datenbankanwendungen in Azure: In diesem Szenario werden die Daten mithilfe der Clientbibliothek für elastische Datenbanken oder mittels Self-Sharding horizontal über mehrere Datenbanken in Azure SQL-Datenbank hinweg partitioniert.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 Database. Ein naheliegender Anwendungsfall ist das Durchführen unteilbarer Änderungen für eine mehrinstanzenfähige Sharding-Anwendung, wenn die Änderungen mehrere Mandanten betreffen.One prominent use case is the need to perform atomic changes for a sharded multi-tenant application when changes span tenants. Stellen Sie sich beispielsweise eine Übertragung zwischen zwei Mandanten in unterschiedlichen Datenbanken vor.Think for instance of a transfer from one tenant to another, both residing on different databases. Ein zweiter Fall wäre differenziertes Sharding zur Erfüllung der Kapazitätsanforderungen eines großen Mandanten. Dies impliziert in der Regel, dass sich einige unteilbare Vorgänge über mehrere, für den gleichen Mandanten verwendete Datenbanken erstrecken.A second case is fine-grained sharding to accommodate capacity needs for a large tenant, which in turn typically implies that some atomic operations need to stretch across several databases used for the same tenant. Ein dritter Fall wären unteilbare Aktualisierungen für Referenzdaten mit datenbankübergreifender Replizierung.A third case is atomic updates to reference data that are replicated across databases. Unteilbare (transaktionsorientierte) Vorgänge dieser Art können jetzt mithilfe der Vorschau über mehrere Datenbanken hinweg koordiniert werden.Atomic, transacted, operations along these lines can now be coordinated across several databases using the preview. Elastische Datenbanktransaktionen verwenden ein Zweiphasencommit, um die datenbankübergreifende Unteilbarkeit von Transaktionen zu gewährleisten.Elastic database transactions use two-phase commit to ensure transaction atomicity across databases. Dies eignet sich gut für Transaktionen mit einer Beteiligung von weniger als 100 Datenbanken pro einzelner Transaktion.It's a good fit for transactions that involve fewer than 100 databases at a time within a single transaction. Diese Limits werden nicht erzwungen. Eine Überschreitung beeinträchtigt jedoch die Leistung und Erfolgsraten von elastischen Datenbanktransaktionen.These limits aren't enforced, but one should expect performance and success rates for elastic database transactions to suffer when exceeding these limits.

Installation und MigrationInstallation and migration

Die Funktionen für elastische Datenbanktransaktionen in Azure SQL-Datenbank werden mittels Aktualisierung der .NET-Bibliotheken „System.Data.dll“ und „System.Transactions.dll“ bereitgestellt.The capabilities for elastic database transactions in SQL Database are provided through updates to the .NET libraries System.Data.dll and System.Transactions.dll. Die DLLs gewährleisten, dass bei Bedarf das Zweiphasencommit verwendet wird, um die Unteilbarkeit sicherzustellen.The DLLs ensure that two-phase commit is used where necessary to ensure atomicity. Installieren Sie .NET 4.6.1 oder eine höhere Version von .NET Framework, um mit dem Entwickeln von Anwendungen mit elastischen Datenbanktransaktionen zu beginnen.To start developing applications using elastic database transactions, install .NET Framework 4.6.1 or a later version. Bei der Ausführung unter einer älteren Version von .NET Framework lassen sich Transaktionen nicht zu einer verteilten Transaktion höher stufen, was eine Ausnahme zur Folge hat.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.

Nach der Installation können Sie die APIs für verteilte Transaktionen in „System.Transactions“ für Verbindungen mit Azure SQL-Datenbank verwenden.After installation, you can use the distributed transaction APIs in System.Transactions with connections to SQL Database. Wenn Sie über MSDTC-Anwendungen verfügen, die diese APIs verwenden, erstellen Sie nach der Installation von .NET Framework 4.6.1 einfach Ihre vorhandenen Anwendungen für .NET Framework 4.6 neu.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. Falls Ihre Projekte auf .NET Framework 4.6 ausgerichtet sind, verwenden sie automatisch die aktualisierten DLLs der neuen .NET Framework-Version. Aufrufe der API für verteilte Transaktion können in Kombination mit Verbindungen zu Azure SQL-Datenbank erfolgreich ausgeführt werden.If your projects target .NET 4.6, they'll automatically use the updated DLLs from the new Framework version and distributed transaction API calls in combination with connections to SQL Database will now succeed.

Beachten Sie, dass für elastische Datenbanktransaktionen keine Installation von MSDTC erforderlich ist.Remember that elastic database transactions don't require installing MSDTC. Elastische Datenbanktransaktionen werden stattdessen direkt durch (und innerhalb von) Azure SQL-Datenbank verwaltet.Instead, elastic database transactions are directly managed by and within SQL Database. Dies vereinfacht Cloudszenarien erheblich, da die Verwendung verteilter Transaktionen mit Azure SQL-Datenbank keine MSDTC-Bereitstellung erfordert.This significantly simplifies cloud scenarios since a deployment of MSDTC isn't necessary to use distributed transactions with SQL Database. Ausführlichere Informationen zum gemeinsamen Bereitstellen von elastischen Datenbanktransaktionen, .NET Framework und Ihren Cloudanwendungen in Azure finden Sie in Abschnitt 4.Section 4 explains in more detail how to deploy elastic database transactions and the required .NET framework together with your cloud applications to Azure.

EntwicklungsumgebungDevelopment experience

MultidatenbankanwendungenMulti-database applications

Der folgende Beispielcode verwendet die vertraute Programmierung mit „System.Transactions“ aus .NET.The following sample code uses the familiar programming experience with .NET System.Transactions. Die TransactionScope-Klasse erstellt eine Ambient-Transaktion in .NET.The TransactionScope class establishes an ambient transaction in .NET. (Eine Ambient-Transaktion ist eine Transaktion aus dem aktuellen Thread.) Alle hergestellten Verbindungen innerhalb des Transaktionsbereichs sind an der Transaktion beteiligt.(An “ambient transaction” is one that lives in the current thread.) All connections opened within the TransactionScope participate in the transaction. Bei Beteiligung verschiedener Datenbanken wird die Transaktion automatisch zu einer verteilten Transaktion höher gestuft.If different databases participate, the transaction is automatically elevated to a distributed transaction. Zum Steuern des Transaktionsergebnisses wird der Bereich auf „Complete“ festgelegt, um einen Commit anzugeben.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();
    }

Sharding-DatenbankanwendungenSharded database applications

Elastische Datenbanktransaktionen für Azure SQL-Datenbank unterstützen auch die Koordinierung verteilter Transaktionen, bei denen Sie mithilfe der OpenConnectionForKey-Methode der Clientbibliothek für elastische Datenbanken Verbindungen für eine horizontal hochskalierte Datenschicht herstellen.Elastic database transactions for SQL Database 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. Beispiele wären etwa Fälle, in denen Sie bei Änderungen Transaktionskonsistenz über verschiedene Sharding-Schlüsselwerte hinweg sicherstellen müssen.Consider cases where you need to guarantee transactional consistency for changes across several different sharding key values. Verbindungen mit den Shards, die die verschiedenen Sharding-Schlüsselwerte hosten, werden mithilfe von „OpenConnectionForKey“ vermittelt.Connections to the shards hosting the different sharding key values are brokered using OpenConnectionForKey. Grundsätzlich können die Verbindungen mit unterschiedlichen Shards hergestellt werden, sodass zur Gewährleistung von Transaktionsgarantien eine verteilte Transaktion erforderlich ist.In the general case, the connections can be to different shards such that ensuring transactional guarantees requires a distributed transaction. Das folgende Codebeispiel veranschaulicht diese Vorgehensweise.The following code sample illustrates this approach. Hierbei wird davon ausgegangen, dass eine Variable namens „shardmap“ eine Shardzuordnung aus der Clientbibliothek für elastische Datenbanken dargestellt: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();
    }

Installation von .NET für Azure Cloud Services.NET installation for Azure Cloud Services

Azure stellt verschiedene Angebote zum Hosten von .NET-Anwendungen bereit.Azure provides several offerings to host .NET applications. Einen Vergleich der verschiedenen Angebote finden Sie unter Azure App Service, Cloud Services und Virtual Machines im Vergleich.A comparison of the different offerings is available in Azure App Service, Cloud Services, and Virtual Machines comparison. Wenn das Gastbetriebssystem des Angebots älter als .NET 4.6.1 ist (das für elastische Transaktionen erforderlich ist), müssen Sie das Gastbetriebssystem auf 4.6.1 aktualisieren.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.

Für Azure App Service werden Upgrades des Gastbetriebssystems derzeit nicht unterstützt.For Azure App Service, upgrades to the guest OS are currently not supported. Melden Sie sich für Azure Virtual Machines einfach auf dem virtuellen Computer an, und führen Sie das Installationsprogramm für das neueste .NET Framework aus.For Azure Virtual Machines, simply log into the VM and run the installer for the latest .NET framework. Für Azure Cloud Services müssen Sie die Installation einer neueren Version von .NET in die Startaufgaben der Bereitstellung einschließen.For Azure Cloud Services, you need to include the installation of a newer .NET version into the startup tasks of your deployment. Informationen zu den Konzepten und Schritten finden Sie unter Installieren von .NET in einer Clouddienstrolle.The concepts and steps are documented in Install .NET on a Cloud Service Role.

Beachten Sie, dass das Installationsprogramm für .NET 4.6.1 während des Bootstrappingprozesses für Azure Cloud Services möglicherweise mehr temporären Speicherplatz benötigt als das für .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. Um eine erfolgreiche Installation sicherzustellen, erhöhen Sie den temporären Speicher für Ihren Azure-Clouddienst in der Datei "ServiceDefinition.csdef" im Abschnitt "LocalResources". Ändern Sie außerdem die Umgebungseinstellungen der Startaufgabe wie im folgenden Beispiel gezeigt: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>

Transaktionen über mehrere ServerTransactions across multiple servers

Hinweis

Dieser Artikel wurde aktualisiert und beinhaltet jetzt das neue Az-Modul von Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Sie können das AzureRM-Modul weiterhin verwenden, das bis mindestens Dezember 2020 weiterhin Fehlerbehebungen erhält.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Weitere Informationen zum neuen Az-Modul und zur Kompatibilität mit AzureRM finden Sie unter Introducing the new Azure PowerShell Az module (Einführung in das neue Az-Modul von Azure PowerShell).To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Anweisungen zur Installation des Az-Moduls finden Sie unter Install Azure PowerShell (Installieren von Azure PowerShell).For Az module installation instructions, see Install Azure PowerShell.

Wichtig

Das PowerShell Azure Resource Manager-Modul wird von Azure SQL-Datenbank weiterhin unterstützt, aber alle zukünftigen Entwicklungen erfolgen für das Az.Sql-Modul.The PowerShell Azure Resource Manager module is still supported by Azure SQL Database, but all future development is for the Az.Sql module. Informationen zu diesen Cmdlets finden Sie unter AzureRM.Sql.For these cmdlets, see AzureRM.Sql. Die Argumente für die Befehle im Az-Modul und den AzureRm-Modulen sind im Wesentlichen identisch.The arguments for the commands in the Az module and in the AzureRm modules are substantially identical.

Elastische Datenbanktransaktionen werden auf verschiedenen Servern in Azure SQL-Datenbank unterstützt.Elastic database transactions are supported across different servers in Azure SQL Database. Bei Transaktionen über die Grenzen Server hinweg müssen die beteiligten Server zuerst in eine Beziehung mit gegenseitiger Kommunikation gebracht werden.When transactions cross server boundaries, the participating servers first need to be entered into a mutual communication relationship. Sobald die Kommunikationsbeziehung eingerichtet wurde, kann eine Datenbank in einem der beiden Server an elastischen Transaktionen mit Datenbanken auf dem anderen Server teilnehmen.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. Mit Transaktionen über mehr als zwei Server hinweg muss eine Kommunikationsbeziehung für jedes Serverpaar vorhanden sein.With transactions spanning more than two servers, a communication relationship needs to be in place for any pair of servers.

Verwenden Sie die folgenden PowerShell-Cmdlets, um serverübergreifende Kommunikationsbeziehungen für elastische Transaktionen zu verwalten:Use the following PowerShell cmdlets to manage cross-server communication relationships for elastic database transactions:

  • New-AzSqlServerCommunicationLink: Mit diesem Cmdlet können Sie eine neue Kommunikationsbeziehung zwischen zwei Servern in Azure SQL-Datenbank erstellen.New-AzSqlServerCommunicationLink: Use this cmdlet to create a new communication relationship between two servers in Azure SQL Database. Die Beziehung ist symmetrisch, sodass beide Server Transaktionen mit dem jeweils anderen Server initiieren können.The relationship is symmetric, which means both servers can initiate transactions with the other server.
  • Get-AzSqlServerCommunicationLink: Mit diesem Cmdlet können Sie vorhandene Kommunikationsbeziehungen und die zugehörigen Eigenschaften abrufen.Get-AzSqlServerCommunicationLink: Use this cmdlet to retrieve existing communication relationships and their properties.
  • Remove-AzSqlServerCommunicationLink: Mit diesem Cmdlet können Sie eine vorhandene Kommunikationsbeziehung entfernen.Remove-AzSqlServerCommunicationLink: Use this cmdlet to remove an existing communication relationship.

Überwachen des TransaktionsstatusMonitoring transaction status

Verwenden Sie DMVs (Dynamic Management Views) in Azure SQL-Datenbank, um Status und Fortschritt laufender elastischer Datenbanktransaktionen zu überwachen.Use Dynamic Management Views (DMVs) in SQL Database to monitor status and progress of your ongoing elastic database transactions. Für verteilte Transaktionen in Azure SQL-Datenbank sind alle transaktionsbezogenen DMVs relevant.All DMVs related to transactions are relevant for distributed transactions in SQL Database. Die entsprechende DMV-Liste finden Sie hier: Dynamische Verwaltungssichten für Transaktionen und Funktionen (Transact-SQL).You can find the corresponding list of DMVs here: Transaction Related Dynamic Management Views and Functions (Transact-SQL).

Folgende DMVs sind besonders hilfreich:These DMVs are particularly useful:

  • sys.dm_tran_active_transactions: Führt die derzeit aktiven Transaktionen und deren Status auf.sys.dm_tran_active_transactions: Lists currently active transactions and their status. Die UOW-Spalte (Arbeitseinheit) gibt die verschiedenen untergeordneten Transaktionen an, die zur gleichen verteilten Transaktion gehören.The UOW (Unit Of Work) column can identify the different child transactions that belong to the same distributed transaction. Alle Transaktionen innerhalb einer verteilten Transaktion haben den gleichen UOW-Wert.All transactions within the same distributed transaction carry the same UOW value. Weitere Informationen finden Sie in der DMV-Dokumentation.See the DMV documentation for more information.
  • sys.dm_tran_database_transactions: Liefert zusätzliche Informationen zu Transaktionen (wie etwa die Position der Transaktion im Protokoll).sys.dm_tran_database_transactions: Provides additional information about transactions, such as placement of the transaction in the log. Weitere Informationen finden Sie in der DMV-Dokumentation.See the DMV documentation for more information.
  • sys.dm_tran_locks: Enthält Informationen zu den Sperren, die derzeit für laufende Transaktionen aktiv sind.sys.dm_tran_locks: Provides information about the locks that are currently held by ongoing transactions. Weitere Informationen finden Sie in der DMV-Dokumentation.See the DMV documentation for more information.

EinschränkungenLimitations

Derzeit gelten für elastische Datenbanktransaktionen in Azure SQL-Datenbank folgende Einschränkungen:The following limitations currently apply to elastic database transactions in SQL Database:

  • Es werden nur datenbankübergreifende Transaktionen in Azure SQL-Datenbank unterstützt.Only transactions across databases in SQL Database are supported. Andere Ressourcenanbieter für X/Open XA sowie Datenbanken außerhalb von Azure SQL-Datenbank können nicht an elastischen Datenbanktransaktionen beteiligt werden.Other X/Open XA resource providers and databases outside of SQL Database can't participate in elastic database transactions. Das bedeutet, dass sich elastische Datenbanktransaktionen nicht über lokale SQL Server- und Azure SQL-Datenbanken erstrecken können.That means that elastic database transactions can't stretch across on premises SQL Server and Azure SQL Database. Für lokale verteilte Transaktionen muss weiterhin MSDTC verwendet werden.For distributed transactions on premises, continue to use MSDTC.
  • Nur clientkoordinierte Transaktionen einer .NET-Anwendung werden unterstützt.Only client-coordinated transactions from a .NET application are supported. Die serverseitige Unterstützung für T-SQL (etwa „BEGIN DISTRIBUTED TRANSACTION“) ist zwar geplant, aber noch nicht verfügbar.Server-side support for T-SQL such as BEGIN DISTRIBUTED TRANSACTION is planned, but not yet available.
  • Transaktionen über WCF-Dienste werden nicht unterstützt.Transactions across WCF services aren't supported. Nehmen wir beispielsweise eine WCF-Dienstmethode, die eine Transaktion ausführt.For example, you have a WCF service method that executes a transaction. Das Umschließen des Aufrufs innerhalb eines Transaktionsbereichs schlägt als System.ServiceModel.ProtocolExceptionfehl.Enclosing the call within a transaction scope will fail as a System.ServiceModel.ProtocolException.

Nächste SchritteNext steps

Bitte richten Sie Fragen über die Microsoft F&A-Seite für SQL-Datenbank an uns.For questions, please reach out to us on the Microsoft Q&A question page for SQL Database. Bitte nutzen Sie für Featureanforderungen das SQL-Datenbank-Feedbackforum.For feature requests, please add them to the SQL Database feedback forum.