Transaksi terdistribusi di seluruh database cloud

Berlaku untuk:Azure SQL DatabaseAzure SQL Managed Instance

Artikel ini menjelaskan penggunaan transaksi database elastis yang memungkinkan Anda menjalankan transaksi terdistribusi di seluruh database cloud untuk Azure SQL Database dan Azure SQL Managed Instance. Dalam artikel ini, istilah "transaksi terdistribusi" dan "transaksi database elastis" dianggap sinonim dan digunakan secara bergantian.

Catatan

Anda juga dapat menggunakan Koordinator Transaksi Terdistribusi untuk Azure SQL Managed Instance untuk menjalankan transaksi terdistribusi di lingkungan campuran.

Gambaran Umum

Transaksi database elastis untuk Azure SQL Database dan Azure SQL Managed Instance memungkinkan Anda menjalankan transaksi yang mencakup beberapa database. Transaksi database elastis tersedia untuk aplikasi .NET menggunakan ADO .NET dan diintegrasikan dengan pengalaman pemrograman yang akrab menggunakan kelas System.Transaction. Untuk mendapatkan pustaka, lihat .NET Framework 4.6.1 (Alat Penginstal Web). Selain itu, transaksi terdistribusi instans terkelola tersedia di Transact-SQL.

Secara lokal, skenario seperti itu biasanya memerlukan menjalankan Koordinator Transaksi Terdistribusi Microsoft (MSDTC). Karena MSDTC tidak tersedia untuk Azure SQL Database, kemampuan untuk mengoordinasikan transaksi terdistribusi telah langsung diintegrasikan ke dalam SQL Database dan SQL Managed Instance. Namun, untuk SQL Managed Instance, Anda juga dapat menggunakan Koordinator Transaksi Terdistribusi untuk menjalankan transaksi terdistribusi di sejumlah lingkungan campuran, seperti di seluruh instans terkelola, SQL Server, sistem manajemen database relasional lainnya (RDBMS), aplikasi kustom, dan peserta transaksi lainnya yang dihosting di lingkungan apa pun yang dapat membangun konektivitas jaringan ke Azure.

Aplikasi dapat tersambung ke database apa pun untuk meluncurkan transaksi terdistribusi, dan salah satu database atau server akan secara transparan mengoordinasikan transaksi terdistribusi, seperti yang ditunjukkan pada gambar berikut.

Distributed transactions with Azure SQL Database using elastic database transactions

Skenario umum

Transaksi database elastis mengaktifkan aplikasi untuk membuat perubahan atomik pada data yang disimpan di beberapa database yang berbeda. Baik SQL Database dan SQL Managed Instance mendukung pengalaman pengembangan sisi klien dalam C# dan .NET. Pengalaman sisi server (kode yang ditulis dalam prosedur tersimpan atau skrip sisi server) menggunakan Transact-SQL hanya tersedia untuk SQL Managed Instance.

Penting

Eksekusi transaksi database elastis antara Azure SQL Database dan Azure SQL Managed Instance tidak didukung. Transaksi database elastis hanya dapat menjangkau kumpulan database di SQL Database atau kumpulan database di seluruh instans terkelola.

Transaksi database elastis menargetkan skenario berikut:

  • Aplikasi multi-database di Azure: Dengan skenario ini, data dipartisi secara vertikal di beberapa database dalam SQL Database atau SQL Managed Instance sedemikian rupa sehingga berbagai jenis data berada di database yang berbeda. Beberapa operasi memerlukan perubahan pada data, yang disimpan dalam dua database atau lebih. Aplikasi ini menggunakan transaksi database elastis untuk mengoordinasikan perubahan di seluruh database dan memastikan atomitas.
  • Aplikasi database yang dipecah di Azure: Dengan skenario ini, tingkat data menggunakan pustaka klien Database Elastis atau melakukan pemecahan mandiri untuk mempartisi data secara horizontal di banyak database di Azure SQL Database atau SQL Managed Instance. Salah satu kasus penggunaan yang menonjol adalah kebutuhan untuk melakukan perubahan atomik untuk aplikasi multipenyewa yang dipecah ketika perubahan mencakup penyewa. Pikirkan misalnya transfer dari satu penyewa ke penyewa lain, keduanya berada di database yang berbeda. Kasus kedua adalah pecahan halus untuk mengakomodasi kebutuhan kapasitas untuk penyewa besar, yang pada gilirannya biasanya menyiratkan bahwa beberapa operasi atomik perlu membentang di beberapa database yang digunakan untuk penyewa yang sama. Kasus ketiga adalah pembaruan atomik untuk merujuk data yang direplikasi di seluruh database. Operasi atomik yang ditransaksikan di sepanjang garis ini sekarang dapat dikoordinasikan di beberapa database. Transaksi database elastis menggunakan dua fase penerapan untuk memastikan atomitas transaksi di seluruh database. Ini cocok untuk transaksi yang melibatkan kurang dari 100 database sekaligus dalam satu transaksi. Batas ini tidak diberlakukan, tetapi performa dan tingkat keberhasilan untuk transaksi database elastis terganggu ketika melebihi batas ini.

Instalasi dan migrasi

Kemampuan untuk transaksi database elastis disediakan melalui pembaruan ke pustaka .NET Data Sistem.dll dan Transaksi Sistem.dll. DLL memastikan bahwa 2PC digunakan jika diperlukan untuk memastikan atomicity. Untuk mulai mengembangkan aplikasi menggunakan transaksi database elastis, instal .NET Framework 4.6.1 atau versi yang lebih baru. Ketika berjalan pada versi .NET framework sebelumnya, transaksi akan gagal dipromosikan ke transaksi terdistribusi dan pengecualian akan dinaikkan.

Setelah penginstalan, Anda dapat menggunakan API transaksi terdistribusi di Transaksi Sistem dengan koneksi ke Azure SQL Database dan SQL Managed Instance. Jika Anda memiliki aplikasi Koordinator Transaksi Terdistribusi (MSDTC) yang ada menggunakan API ini, bangun kembali aplikasi yang ada untuk .NET 4.6 setelah menginstal .NET Framework 4.6.1. Jika menargetkan .NET 4.6, proyek Anda akan secara otomatis menggunakan DLL yang diperbarui dari versi .NET Framework baru dan transaksi terdistribusi API memanggil dalam kombinasi dengan koneksi ke Azure SQL Database atau SQL Managed Instance sekarang akan berhasil.

Ingat bahwa transaksi database elastis tidak memerlukan penginstalan Koordinator Transaksi Terdistribusi (MSDTC). Sebaliknya, transaksi database elastis dikelola langsung oleh dan dalam layanan. Ini secara signifikan menyederhanakan skenario cloud karena penyebaran Koordinator Transaksi terdistribusi (MSDTC) tidak perlu menggunakan transaksi terdistribusi dengan Azure SQL Database atau SQL Managed Instance. Bagian 4 menjelaskan secara lebih rinci cara menyebarkan transaksi database elastis dan .NET framework yang diperlukan bersama dengan aplikasi cloud Anda ke Azure.

Penginstalan .NET untuk Azure Cloud Services

Azure menyediakan beberapa penawaran untuk hosting aplikasi .NET. Perbandingan penawaran yang berbeda tersedia di Azure App Service, Cloud Services, dan perbandingan Komputer Virtual. Jika OS tamu penawaran lebih kecil dari .NET 4.6.1 yang diperlukan untuk transaksi elastis, Anda perlu meningkatkan OS tamu menjadi 4.6.1.

Untuk Azure App Service, peningkatan ke OS tamu saat ini tidak didukung. Untuk Azure Virtual Machines, cukup masuk ke komputer virtual dan jalankan alat penginstal untuk .NET framework terbaru. Untuk Azure Cloud Services, Anda perlu menyertakan penginstalan versi .NET yang lebih baru ke dalam tugas permulaan penyebaran Anda. Konsep dan langkah-langkah didokumentasikan dalam Instal .NET pada Peran Layanan Awan.

Perhatikan bahwa alat penginstal untuk .NET 4.6.1 mungkin memerlukan lebih banyak penyimpanan sementara selama proses bootstrap pada layanan awan Azure daripada alat penginstal untuk .NET 4.6. Untuk memastikan instalasi berhasil, Anda perlu meningkatkan penyimpanan sementara untuk layanan awan Azure Anda di file ServiceDefinition.csdef Anda di bagian LocalResources dan pengaturan lingkungan tugas permulaan Anda, seperti yang diperlihatkan dalam sampel berikut:

<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>

Pengalaman pengembangan .NET

Aplikasi multi-database

Sampel kode berikut menggunakan pengalaman pemrograman yang akrab dengan Transaksi Sistem .NET. Kelas TransactionScope menetapkan transaksi sekitar di .NET. ("Transaksi sekitar" adalah transaksi yang hidup dalam utas saat ini.) Semua koneksi yang dibuka dalam TransactionScope berpartisipasi dalam transaksi. Jika database yang berbeda berpartisipasi, transaksi secara otomatis ditingkatkan ke transaksi terdistribusi. Hasil transaksi dikontrol dengan mengatur cakupan untuk menyelesaikan untuk menunjukkan penerapan.

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();
}

Aplikasi database yang dipecah

Transaksi database elastis untuk Azure SQL Database dan SQL Managed Instance juga mendukung koordinasi transaksi terdistribusi di mana Anda menggunakan metode OpenConnectionForKey dari pustaka klien database elastis untuk membuka koneksi untuk tingkat data yang diskalakan. Pertimbangkan kasus di mana Anda perlu menjamin konsistensi transaksional untuk perubahan di beberapa nilai kunci pecahan yang berbeda. Koneksi ke pecahan yang meng-hosting nilai kunci pecahan yang berbeda ditengahi menggunakan OpenConnectionForKey. Dalam kasus umum, koneksi dapat ke pecahan yang berbeda sehingga memastikan jaminan transaksional membutuhkan transaksi terdistribusi. Sampel kode berikut mengilustrasikan pendekatan ini. Ini mengasumsikan bahwa variabel yang disebut shardmap digunakan untuk mewakili peta pecahan dari pustaka klien database elastis:

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

Pengalaman pengembangan T-SQL

Transaksi terdistribusi sisi server menggunakan T-SQL hanya tersedia untuk Azure SQL Managed Instance. Transaksi terdistribusi hanya dapat dijalankan antara instans yang termasuk dalam grup kepercayaan Server yang sama. Dalam skenario ini, instans terkelola perlu menggunakan server tertaut untuk saling mereferensikan.

Sampel kode T-SQL berikut menggunakan BEGIN DISTRIBUTED TRANSACTION untuk memulai transaksi terdistribusi.

    -- Configure the Linked Server
    -- Add one Azure SQL Managed Instance as Linked Server
    EXEC sp_addlinkedserver
        @server='RemoteServer', -- Linked server name
        @srvproduct='',
        @provider='MSOLEDBSQL', -- Microsoft OLE DB Driver for SQL Server
        @datasrc='managed-instance-server.46e7afd5bc81.database.windows.net' -- SQL Managed Instance endpoint

    -- Add credentials and options to this Linked Server
    EXEC sp_addlinkedsrvlogin
        @rmtsrvname = 'RemoteServer', -- Linked server name
        @useself = 'false',
        @rmtuser = '<login_name>',         -- login
        @rmtpassword = '<secure_password>' -- password

    USE AdventureWorks2022;
    GO
    SET XACT_ABORT ON;
    GO
    BEGIN DISTRIBUTED TRANSACTION;
    -- Delete candidate from local instance.
    DELETE AdventureWorks2022.HumanResources.JobCandidate
        WHERE JobCandidateID = 13;
    -- Delete candidate from remote instance.
    DELETE RemoteServer.AdventureWorks2022.HumanResources.JobCandidate
        WHERE JobCandidateID = 13;
    COMMIT TRANSACTION;
    GO

Menggabungkan pengalaman pengembangan .NET dan T-SQL

Aplikasi .NET yang menggunakan kelas Transaksi Sistem dapat menggabungkan kelas TransactionScope dengan pernyataan T-SQL BEGIN DISTRIBUTED TRANSACTION. Dalam TransactionScope, transaksi dalam yang menjalankan BEGIN DISTRIBUTED TRANSACTION secara eksplisit akan dipromosikan ke transaksi terdistribusi. Juga, ketika SqlConnecton kedua dibuka dalam TransactionScope, itu akan secara implisit dipromosikan ke transaksi terdistribusi. Setelah transaksi terdistribusi dimulai, semua permintaan transaksi berikutnya, apakah mereka berasal dari .NET atau T-SQL, akan bergabung dengan induk transaksi terdistribusi. Sebagai konsekuensinya semua cakupan transaksi bersarang yang dimulai oleh pernyataan BEGIN akan berakhir dalam transaksi yang sama dan pernyataan COMMIT / ROLLBACK akan memiliki efek berikut pada hasil keseluruhan:

  • Pernyataan COMMIT tidak akan berpengaruh pada cakupan transaksi yang dimulai oleh pernyataan BEGIN, yaitu, tidak ada hasil yang akan diterapkan sebelum metode Complete() dipanggil pada objek TransactionScope. Jika objek TransactionScope dihancurkan sebelum selesai, semua perubahan yang dilakukan dalam cakupan akan digulung balik.
  • Pernyataan ROLLBACK akan menyebabkan seluruh TransactionScope digulung balik. Setiap upaya untuk mendaftarkan transaksi baru dalam TransactionScope akan gagal setelahnya, serta mencoba untuk memanggil Complete() pada objek TransactionScope.

Berikut adalah contoh di mana transaksi secara eksplisit dipromosikan ke transaksi terdistribusi dengan T-SQL.

using (TransactionScope s = new TransactionScope())
{
    using (SqlConnection conn = new SqlConnection(DB0_ConnectionString)
    {
        conn.Open();
    
        // Transaction is here promoted to distributed by BEGIN statement
        //
        Helper.ExecuteNonQueryOnOpenConnection(conn, "BEGIN DISTRIBUTED TRAN");
        // ...
    }
 
    using (SqlConnection conn2 = new SqlConnection(DB1_ConnectionString)
    {
        conn2.Open();
        // ...
    }
    
    s.Complete();
}

Contoh berikut menunjukkan transaksi yang secara implisit dipromosikan ke transaksi terdistribusi setelah SqlConnecton kedua dimulai dalam TransactionScope.

using (TransactionScope s = new TransactionScope())
{
    using (SqlConnection conn = new SqlConnection(DB0_ConnectionString)
    {
        conn.Open();
        // ...
    }
    
    using (SqlConnection conn = new SqlConnection(DB1_ConnectionString)
    {
        // Because this is second SqlConnection within TransactionScope transaction is here implicitly promoted distributed.
        //
        conn.Open(); 
        Helper.ExecuteNonQueryOnOpenConnection(conn, "BEGIN DISTRIBUTED TRAN");
        Helper.ExecuteNonQueryOnOpenConnection(conn, lsQuery);
        // ...
    }
    
    s.Complete();
}

Transaksi untuk SQL Database

Transaksi database elastis didukung di berbagai server di Azure SQL Database. Ketika transaksi lintas batas server, server yang berpartisipasi terlebih dahulu perlu dimasukkan ke dalam hubungan komunikasi bersama. Setelah hubungan komunikasi terjalin, database apa pun di salah satu dari dua server dapat berpartisipasi dalam transaksi elastis dengan database dari server lain. Dengan transaksi yang mencakup lebih dari dua server, hubungan komunikasi perlu diberlakukan untuk sepasang server.

Gunakan cmdlet PowerShell berikut untuk mengelola hubungan komunikasi lintas server untuk transaksi database elastis:

  • New-AzSqlServerCommunicationLink: Gunakan cmdlet ini untuk membuat hubungan komunikasi baru antara dua server di Azure SQL Database. Hubungan ini simetris, yang berarti kedua server dapat memulai transaksi dengan server lain.
  • Get-AzSqlServerCommunicationLink: Gunakan cmdlet ini untuk mengambil hubungan komunikasi yang ada dan properti mereka.
  • Remove-AzSqlServerCommunicationLink: Gunakan cmdlet ini untuk menghapus hubungan komunikasi yang ada.

Transaksi untuk SQL Managed Instance

Transaksi terdistribusi didukung di seluruh database dalam beberapa instans. Jika transaksi lintas batas instans terkelola, instans yang berpartisipasi harus berada dalam hubungan keamanan dan komunikasi yang saling menguntungkan. Ini dilakukan dengan membuat Server Trust Group, yang dapat dilakukan dengan menggunakan portal Microsoft Azure atau Azure PowerShell atau Azure CLI. Jika instans tidak berada di jaringan Virtual yang sama, maka Anda harus mengonfigurasi Peering jaringan virtual dan Aturan masuk dan keluar kelompok keamanan jaringan harus mengizinkan port 5024 dan 11000-12000 di semua jaringan Virtual yang berpartisipasi.

Server Trust Groups on Azure Portal

Diagram berikut menunjukkan Grup Kepercayaan Server dengan instans terkelola yang dapat menjalankan transaksi terdistribusi dengan .NET atau T-SQL:

Distributed transactions with Azure SQL Managed Instance using elastic transactions

Memantau status transaksi

Gunakan Tampilan Manajemen Dinamis (DMV) untuk memantau status dan kemajuan transaksi database elastis Anda yang sedang berlangsung. Semua DMV yang terkait dengan transaksi relevan untuk transaksi terdistribusi dalam Azure SQL Database dan SQL Managed Instance. Anda dapat menemukan daftar DMV yang sesuai di sini: Fungsi dan Tampilan Manajemen Dinamis Terkait Transaksi (T-SQL).

DMV ini sangat berguna:

  • sys.dm_tran_active_transactions: Mencantumkan transaksi yang sedang aktif berikut statusnya saat ini. Kolom UOW (Unit Kerja) dapat mengidentifikasi berbagai transaksi anak yang termasuk dalam transaksi terdistribusi yang sama. Semua transaksi dalam transaksi terdistribusi yang sama memiliki nilai UOW yang sama. Untuk informasi selengkapnya, lihat dokumentasi DMV.
  • sys.dm_tran_database_transactions: Memberikan informasi tambahan tentang transaksi, seperti penempatan transaksi di log. Untuk informasi selengkapnya, lihat dokumentasi DMV.
  • sys.dm_tran_locks: Memberikan informasi tentang kunci yang saat ini dipegang oleh transaksi yang sedang berlangsung. Untuk informasi selengkapnya, lihat dokumentasi DMV.

Pembatasan

Saat ini, batasan berikut berlaku untuk transaksi database elastis di SQL Database:

  • Hanya transaksi di seluruh database di Azure SQL Database yang didukung. Penyedia sumber daya X/Open XA lainnya dan database di luar SQL Database tidak dapat berpartisipasi dalam transaksi database elastis. Itu berarti bahwa transaksi database elastis tidak dapat membentang di SQL Server lokal dan Azure SQL Database. Untuk transaksi terdistribusi lokal, terus gunakan Koordinator Transaksi Terdistribusi (MSDTC).
  • Hanya transaksi yang dikoordinasikan klien dari aplikasi .NET yang didukung. Dukungan sisi server untuk T-SQL seperti BEGIN DISTRIBUTED TRANSACTION direncanakan, tetapi belum tersedia.
  • Transaksi di seluruh layanan WCF tidak didukung. Misalnya, Anda memiliki metode layanan WCF yang menjalankan transaksi. Menutup panggilan dalam cakupan transaksi akan gagal sebagai System.ServiceModel.ProtocolException.

Batasan berikut saat ini berlaku untuk transaksi terdistribusi (juga dikenal sebagai transaksi elastis atau transaksi terdistribusi yang didukung secara asli) di SQL Managed Instance:

  • Dengan teknologi ini, hanya transaksi di seluruh database dalam instans terkelola yang didukung. Untuk semua skenario lain yang mungkin mencakup penyedia sumber daya X/Open XA dan database di luar Azure SQL Managed Instance, Anda harus mengonfigurasi DTC untuk Azure SQL Managed Instance.
  • Transaksi di seluruh layanan WCF tidak didukung. Misalnya, Anda memiliki metode layanan WCF yang menjalankan transaksi. Menutup panggilan dalam cakupan transaksi akan gagal sebagai System.ServiceModel.ProtocolException.
  • Azure SQL Managed Instance harus menjadi bagian dari Grup kepercayaan server untuk berpartisipasi dalam transaksi terdistribusi.
  • Batasan Grup kepercayaan server mempengaruhi transaksi terdistribusi.
  • Instans Terkelola yang berpartisipasi dalam transaksi terdistribusi harus memiliki konektivitas melalui titik akhir privat (menggunakan alamat IP privat dari jaringan virtual tempat mereka disebarkan) dan perlu dirujuk bersama menggunakan FQDN privat. Aplikasi klien dapat menggunakan transaksi terdistribusi pada titik akhir privat. Selain itu, dalam kasus ketika T-SQL memanfaatkan server yang ditautkan merujuk titik akhir privat, aplikasi klien dapat menggunakan transaksi terdistribusi pada titik akhir publik juga. Batasan ini dijelaskan pada diagram berikut.

Private endpoint connectivity limitation

Langkah berikutnya