Bulut veritabanlarında dağıtılmış işlemler

Şunlar için geçerlidir:Azure SQL Veritabanı Azure SQL Yönetilen Örneği

Bu makalede, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği için bulut veritabanları arasında dağıtılmış işlemleri çalıştırmanıza olanak tanıyan esnek veritabanı işlemlerinin kullanımı açıklanmaktadır. Bu makalede, "dağıtılmış işlemler" ve "elastik veritabanı işlemleri" terimleri eş anlamlı olarak kabul edilir ve birbirinin yerine kullanılır.

Dekont

Dağıtılmış işlemleri karma ortamlarda çalıştırmak üzere Azure SQL Yönetilen Örneği için Dağıtılmış İşlem Düzenleyicisi'ni de kullanabilirsiniz.

Genel Bakış

Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği için esnek veritabanı işlemleri, çeşitli veritabanlarına yayılan işlemleri çalıştırmanıza olanak sağlar. Elastik veritabanı işlemleri, ADO.NET kullanan .NET uygulamaları için kullanılabilir ve System.Transaction sınıflarını kullanarak tanıdık programlama deneyimiyle tümleştirilir. Kitaplığı almak için bkz . .NET Framework 4.6.1 (Web Yükleyicisi). Buna ek olarak yönetilen örnek için dağıtılmış işlemler Transact-SQL'de sağlanır.

Şirket içinde, böyle bir senaryo genellikle Microsoft Dağıtılmış İşlem Düzenleyicisi'nin (MSDTC) çalıştırılmasını gerektirir. MSDTC Azure SQL Veritabanı için kullanılamadığından, dağıtılmış işlemleri koordine etme özelliği doğrudan SQL Veritabanı ve SQL Yönetilen Örneği ile tümleştirilmiştir. Ancak, SQL Yönetilen Örneği için Dağıtılmış İşlem Düzenleyicisi'ni kullanarak yönetilen örnekler, SQL Server'lar, diğer ilişkisel veritabanı yönetim sistemleri (RDBMS), özel uygulamalar ve Azure'a ağ bağlantısı kurabilen herhangi bir ortamda barındırılan diğer işlem katılımcıları gibi çeşitli karma ortamlarda dağıtılmış işlemler çalıştırabilirsiniz.

Uygulamalar, dağıtılmış işlemleri başlatmak için herhangi bir veritabanına bağlanabilir ve aşağıdaki şekilde gösterildiği gibi veritabanlarından veya sunuculardan biri dağıtılmış işlemi saydam bir şekilde koordine eder.

Distributed transactions with Azure SQL Database using elastic database transactions

Genel senaryolar

Elastik veritabanı işlemleri, uygulamaların birkaç farklı veritabanında depolanan verilerde atomik değişiklikler yapmasına olanak tanır. Hem SQL Veritabanı hem de SQL Yönetilen Örneği C# ve .NET'te istemci tarafı geliştirme deneyimlerini destekler. Transact-SQL kullanan sunucu tarafı deneyimi (saklı yordamlarda veya sunucu tarafı betiklerde yazılmış kod), yalnızca SQL Yönetilen Örneği kullanılabilir.

Önemli

Azure SQL Veritabanı ile Azure SQL Yönetilen Örneği arasında elastik veritabanı işlemlerinin çalıştırılması desteklenmez. Elastik veritabanı işlemi yalnızca SQL Veritabanı içindeki bir veritabanı kümesine veya yönetilen örnekler arasında bir dizi veritabanına yayılabilir.

Elastik veritabanı işlemleri aşağıdaki senaryoları hedefler:

  • Azure'daki çok veritabanılı uygulamalar: Bu senaryoyla, veriler SQL Veritabanı veya SQL Yönetilen Örneği farklı veritabanlarında farklı veri türlerine sahip olacak şekilde çeşitli veritabanları arasında dikey olarak bölümlenmiştir. Bazı işlemler, iki veya daha fazla veritabanında tutulan verilerde değişiklik yapılmasını gerektirir. Uygulama, değişiklikleri veritabanları arasında koordine etmek ve bölünmezliği sağlamak için elastik veritabanı işlemlerini kullanır.
  • Azure'daki parçalı veritabanı uygulamaları: Bu senaryoyla, veri katmanı Elastik Veritabanı istemci kitaplığını veya kendi kendine parçalama kullanarak verileri SQL Veritabanı veya SQL Yönetilen Örneği birçok veritabanında yatay olarak bölümlere ayırır. Önemli kullanım örneklerinden biri, değişiklikler kiracılara yayıldığında parçalanmış çok kiracılı bir uygulama için atomik değişiklikler gerçekleştirme gereksinimidir. Her ikisi de farklı veritabanlarında bulunan bir kiracıdan diğerine aktarım örneğini düşünün. İkinci bir durum, büyük bir kiracının kapasite gereksinimlerini karşılamak için ayrıntılı parçalamadır ve bu da genellikle bazı atomik işlemlerin aynı kiracı için kullanılan birkaç veritabanı arasında esnetilmesi gerektiğini gösterir. Üçüncü bir durum, veritabanları arasında çoğaltılan verilere başvurmak için atomik güncelleştirmelerdir. Atomik, işlem yapılmış, bu satırlardaki işlemler artık çeşitli veritabanlarında eşgüdümlü olabilir. Elastik veritabanı işlemleri, veritabanları arasında işlem bölünmezliğini sağlamak için iki aşamalı işleme kullanır. Tek bir işlem içinde aynı anda 100'den az veritabanı içeren işlemler için uygundur. Bu sınırlar uygulanmaz, ancak elastik veritabanı işlemleri için performans ve başarı oranlarının bu sınırları aşıldığında acı çekmesi beklenmelidir.

Yükleme ve geçiş

Elastik veritabanı işlemlerine yönelik özellikler, .NET kitaplıkları System.Data.dll ve System.Transactions.dll güncelleştirmeleri aracılığıyla sağlanır. DLL'ler, bölünmezliği sağlamak için gerektiğinde iki aşamalı işlemenin kullanılmasını sağlar. Elastik veritabanı işlemlerini kullanarak uygulama geliştirmeye başlamak için .NET Framework 4.6.1 veya sonraki bir sürümü yükleyin. .NET framework'ün önceki bir sürümünde çalıştırıldığında, işlemler dağıtılmış bir işleme yükseltilmeyecek ve bir özel durum tetiklenecektir.

Yüklemeden sonra, system.transactions içindeki dağıtılmış işlem API'lerini SQL Veritabanı ve SQL Yönetilen Örneği bağlantılarla kullanabilirsiniz. Bu API'leri kullanan mevcut MSDTC uygulamalarınız varsa, 4.6.1 Framework'i yükledikten sonra .NET 4.6 için mevcut uygulamalarınızı yeniden oluşturun. Projeleriniz .NET 4.6'yı hedeflerse, yeni Framework sürümünden güncelleştirilmiş DLL'leri otomatik olarak kullanırlar ve SQL Veritabanı veya SQL Yönetilen Örneği bağlantıları ile birlikte dağıtılmış işlem API'leri çağrıları artık başarılı olur.

Elastik veritabanı işlemlerinin MSDTC'nin yüklenmesini gerektirmediğini unutmayın. Bunun yerine, elastik veritabanı işlemleri doğrudan hizmet tarafından ve içinde yönetilir. SQL Veritabanı veya SQL Yönetilen Örneği ile dağıtılmış işlemleri kullanmak için MSDTC dağıtımı gerekli olmadığından bu durum bulut senaryolarını önemli ölçüde basitleştirir. Bölüm 4'te, esnek veritabanı işlemlerinin ve gerekli .NET çerçevesinin bulut uygulamalarınızla birlikte Azure'a nasıl dağıtılacağı daha ayrıntılı olarak açıklanmaktadır.

Azure Cloud Services için .NET yüklemesi

Azure, .NET uygulamalarını barındırmak için çeşitli teklifler sunar. Farklı tekliflerin karşılaştırması Azure Uygulaması Service, Cloud Services ve Sanal Makineler karşılaştırmasında kullanılabilir. Teklifin konuk işletim sistemi esnek işlemler için gereken .NET 4.6.1'den küçükse konuk işletim sistemini 4.6.1'e yükseltmeniz gerekir.

Azure Uygulaması Hizmeti için konuk işletim sistemine yükseltmeler şu anda desteklenmiyor. Azure Sanal Makineler için VM'de oturum açmanız ve en son .NET framework için yükleyiciyi çalıştırmanız yeterlidir. Azure Cloud Services için, dağıtımınızın başlangıç görevlerine daha yeni bir .NET sürümünün yüklenmesini eklemeniz gerekir. Kavramlar ve adımlar Bulut Hizmeti Rolüne .NET Yükleme bölümünde belgelenmiştir.

.NET 4.6.1 yükleyicisinin, Azure bulut hizmetlerindeki önyükleme işlemi sırasında .NET 4.6 yükleyicisinden daha fazla geçici depolama gerektirebileceğini unutmayın. Yüklemenin başarılı olmasını sağlamak için, aşağıdaki örnekte gösterildiği gibi LocalResources bölümündeki ServiceDefinition.csdef dosyanızda ve başlangıç görevinizin ortam ayarlarında Azure bulut hizmetinizin geçici depolama alanını artırmanız gerekir:

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

.NET geliştirme deneyimi

Çok veritabanılı uygulamalar

Aşağıdaki örnek kod, .NET System.Transactions ile ilgili tanıdık programlama deneyimini kullanır. TransactionScope sınıfı .NET'te bir ortam işlemi oluşturur. ("Ortam işlemi", geçerli iş parçacığında bulunan işlemdir.) TransactionScope içinde açılan tüm bağlantılar işleme katılır. Farklı veritabanları katılırsa, işlem otomatik olarak dağıtılmış bir işleme yükseltilir. İşlemin sonucu, kapsamı işlemeyi gösterecek şekilde tamamlayacak şekilde ayarlanarak denetlenilir.

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

Parçalı veritabanı uygulamaları

SQL Veritabanı ve SQL Yönetilen Örneği için esnek veritabanı işlemleri, genişletilmiş bir veri katmanına yönelik bağlantıları açmak için elastik veritabanı istemci kitaplığının Open Bağlan ionForKey yöntemini kullandığınız dağıtılmış işlemlerin koordinesini de destekler. Birkaç farklı parçalama anahtarı değerindeki değişiklikler için işlem tutarlılığını garanti etmeniz gereken durumları göz önünde bulundurun. Farklı parçalama anahtarı değerlerini barındıran parçalar için Bağlan, Open Bağlan ionForKey kullanılarak aracılık edilir. Genel durumda bağlantılar, işlem garantilerinin sağlanması için dağıtılmış bir işlem gerektirecek şekilde farklı parçalara yönelik olabilir. Aşağıdaki kod örneği bu yaklaşımı göstermektedir. Elastik veritabanı istemci kitaplığından bir parça eşlemesini temsil etmek için parça haritası adlı bir değişkenin kullanıldığını varsayar:

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

Transact-SQL geliştirme deneyimi

Transact-SQL kullanan sunucu tarafı dağıtılmış işlemler yalnızca Azure SQL Yönetilen Örneği için kullanılabilir. Dağıtılmış işlem yalnızca aynı Sunucu güven grubuna ait örnekler arasında yürütülebilir. Bu senaryoda, yönetilen örneklerin birbirine başvurmak için bağlı sunucuyu kullanması gerekir.

Aşağıdaki örnek Transact-SQL kodu, dağıtılmış işlemi başlatmak için BEGIN DISTRIBUTED TRANSACTION kullanır.

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

.NET ve Transact-SQL geliştirme deneyimini birleştirme

System.Transaction sınıflarını kullanan .NET uygulamaları TransactionScope sınıfını Transact-SQL deyimi BEGIN DISTRIBUTED TRANSACTION ile birleştirebilir. TransactionScope içinde BEGIN DISTRIBUTED TRANSACTION işlemini yürüten iç işlem açıkça dağıtılmış işleme yükseltilecektir. Ayrıca, TransactionScope içinde ikinci Sql Bağlan on açıldığında örtük olarak dağıtılmış işleme yükseltilir. Dağıtılmış işlem başlatıldıktan sonra, ister .NET'ten ister Transact-SQL'den gelen sonraki tüm işlemler üst dağıtılmış işleme katılır. Sonuç olarak BEGIN deyimi tarafından başlatılan tüm iç içe işlem kapsamları aynı işlemle sonuçlanır ve COMMIT/ROLLBACK deyimleri genel sonuç üzerinde aşağıdaki etkiye sahip olur:

  • COMMIT deyimi, BEGIN deyimi tarafından başlatılan işlem kapsamı üzerinde herhangi bir etkiye sahip olmaz, yani TransactionScope nesnesinde Complete() yöntemi çağrılmadan önce hiçbir sonuç işlenmez. TransactionScope nesnesi tamamlanmadan önce yok edilirse kapsam içinde yapılan tüm değişiklikler geri alınır.
  • ROLLBACK deyimi, TransactionScope'un tamamının geri alınmasına neden olur. TransactionScope içinde yeni işlemleri listeleme girişimleri daha sonra başarısız olur ve TransactionScope nesnesinde Complete() çağrılmaya çalışılır.

Transact-SQL ile işlemin açıkça dağıtılmış işleme yükseltildiği bir örnek aşağıda verilmiştir.

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

Aşağıdaki örnekte, TransactionScope içinde ikinci Sql Bağlan on başlatıldıktan sonra örtük olarak dağıtılmış işleme yükseltilen bir işlem gösterilmektedir.

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

SQL Veritabanı için işlemler

Elastik veritabanı işlemleri Azure SQL Veritabanı farklı sunucularda desteklenir. İşlemler sunucu sınırlarını aştığında, katılan sunucuların ilk olarak karşılıklı bir iletişim ilişkisine girilmesi gerekir. İletişim ilişkisi kurulduktan sonra, iki sunucudan herhangi birindeki herhangi bir veritabanı diğer sunucudan veritabanlarıyla esnek işlemlere katılabilir. İkiden fazla sunucuya yayılan işlemlerle, herhangi bir sunucu çifti için bir iletişim ilişkisinin olması gerekir.

Esnek veritabanı işlemleri için sunucular arası iletişim ilişkilerini yönetmek için aşağıdaki PowerShell cmdlet'lerini kullanın:

  • New-AzSqlServerCommunicationLink: Azure SQL Veritabanı'daki iki sunucu arasında yeni bir iletişim ilişkisi oluşturmak için bu cmdlet'i kullanın. İlişki simetriktir, yani her iki sunucu da diğer sunucuyla işlem başlatabilir.
  • Get-AzSqlServerCommunicationLink: Mevcut iletişim ilişkilerini ve özelliklerini almak için bu cmdlet'i kullanın.
  • Remove-AzSqlServerCommunicationLink: Var olan bir iletişim ilişkisini kaldırmak için bu cmdlet'i kullanın.

SQL Yönetilen Örneği için işlemler

Dağıtılmış işlemler birden çok örnek içindeki veritabanları arasında desteklenir. İşlemler yönetilen örnek sınırlarını aştığında, işleme katılan örneklerin karşılıklı güven ve iletişim ilişkisi içinde olması gerekir. Bu, Azure portalı, Azure PowerShell veya Azure CLI kullanılarak yapabilen bir Sunucu Güven Grubu oluşturularak gerçekleştirilir. Örnekler aynı Sanal ağda değilse, Sanal ağ eşlemesini yapılandırmanız ve Ağ güvenlik grubu gelen ve giden kurallarının tüm katılan Sanal ağlarda 5024 ve 11000-12000 bağlantı noktalarına izin vermesi gerekir.

Server Trust Groups on Azure Portal

Aşağıdaki diyagramda .NET veya Transact-SQL ile dağıtılmış işlemleri yürütebilen yönetilen örnekleri olan bir Sunucu Güven Grubu gösterilmektedir:

Distributed transactions with Azure SQL Managed Instance using elastic transactions

İşlem durumunu izleme

Devam eden elastik veritabanı işlemlerinizin durumunu ve ilerleme durumunu izlemek için Dinamik Yönetim Görünümlerini (DMV) kullanın. İşlemlerle ilgili tüm DMV'ler SQL Veritabanı ve SQL Yönetilen Örneği dağıtılmış işlemler için geçerlidir. İlgili DMV listesini burada bulabilirsiniz: İşlemle İlgili Dinamik Yönetim Görünümleri ve İşlevleri (Transact-SQL).

Bu DMV'ler özellikle yararlıdır:

  • sys.dm_tran_active_transactions: Şu anda etkin olan işlemleri ve bunların durumunu listeler. UOW (Çalışma Birimi) sütunu, aynı dağıtılmış işleme ait farklı alt işlemleri tanımlayabilir. Aynı dağıtılmış işlem içindeki tüm işlemler aynı UOW değerini taşır. Daha fazla bilgi için DMV belgelerine bakın.
  • sys.dm_tran_database_transactions: İşlemler hakkında, işlemin günlüğe yerleştirilmesi gibi ek bilgiler sağlar. Daha fazla bilgi için DMV belgelerine bakın.
  • sys.dm_tran_locks: Devam eden işlemler tarafından tutulan kilitler hakkında bilgi sağlar. Daha fazla bilgi için DMV belgelerine bakın.

Sınırlamalar

Şu anda SQL Veritabanı'daki elastik veritabanı işlemleri için aşağıdaki sınırlamalar geçerlidir:

  • Yalnızca SQL Veritabanı veritabanlarındaki işlemler desteklenir. SQL Veritabanı dışındaki diğer X/Open XA kaynak sağlayıcıları ve veritabanları esnek veritabanı işlemlerine katılamaz. Bu, elastik veritabanı işlemlerinin şirket içi SQL Server ve Azure SQL Veritabanı arasında genişletilemeyecekleri anlamına gelir. Şirket içi dağıtılmış işlemler için MSDTC kullanmaya devam edin.
  • Yalnızca bir .NET uygulamasından istemciyle eşgüdümlü işlemler desteklenir. BEGIN DISTRIBUTED TRANSACTION gibi T-SQL için sunucu tarafı desteği planlanır, ancak henüz kullanılamaz.
  • WCF hizmetleri arasındaki işlemler desteklenmez. Örneğin, bir işlemi yürüten bir WCF hizmet yönteminiz vardır. Çağrının bir işlem kapsamı içine alınması System.ServiceModel.ProtocolException olarak başarısız olur.

Şu anda SQL Yönetilen Örneği dağıtılmış işlemler (elastik işlemler veya yerel olarak desteklenen dağıtılmış işlemler olarak da bilinir) için aşağıdaki sınırlamalar geçerlidir:

  • Bu teknolojiyle yalnızca yönetilen örneklerdeki veritabanlarındaki işlemler desteklenir. X/Open XA kaynak sağlayıcılarını ve Azure SQL Yönetilen Örneği dışındaki veritabanlarını içerebilecek diğer tüm senaryolar için DTC'yi Azure SQL Yönetilen Örneği için yapılandırmanız gerekir.
  • WCF hizmetleri arasındaki işlemler desteklenmez. Örneğin, bir işlemi yürüten bir WCF hizmet yönteminiz vardır. Çağrının bir işlem kapsamı içine alınması System.ServiceModel.ProtocolException olarak başarısız olur.
  • Azure SQL Yönetilen Örneği bir Dağıtılmış işleme katılmak için sunucu güven grubu.
  • Sunucu güven gruplarının sınırlamaları dağıtılmış işlemleri etkiler.
  • Dağıtılmış işlemlere katılan Yönetilen Örneklerin özel uç noktalar (dağıtıldıkları sanal ağdan özel IP adresi kullanılarak) üzerinden bağlantıya sahip olması ve özel FQDN'ler kullanılarak karşılıklı olarak başvurulmaları gerekir. İstemci uygulamaları özel uç noktalarda dağıtılmış işlemleri kullanabilir. Ayrıca Transact-SQL özel uç noktalara başvuran bağlı sunuculardan yararlandığında istemci uygulamaları da ortak uç noktalarda dağıtılmış işlemleri kullanabilir. Bu sınırlama aşağıdaki diyagramda açıklanmıştır.

Private endpoint connectivity limitation

Sonraki adımlar