العمليات الموزعة عبر قواعد البيانات السحابية

ينطبق على: قاعدة بيانات Azure SQL مثيل Azure SQL المُدار

تسمح لك عمليات قاعدة البيانات المرنة لـAzure SQL Database وAzure SQL المُدارة بتشغيل العمليات التي تمتد عبر العديد من قواعد البيانات. تتوفر معاملات قاعدة البيانات المرنة لتطبيقات .NET التي تستخدم ADO.NET وتتكامل مع تجربة البرمجة المعتادة باستخدام فئات System.Transaction . للحصول على مكتبة التعليمات البرمجية، راجع .NET Framework 4.6.1 (مثبت الويب). بالإضافة إلى ذلك، تتوفر المعاملات الموزعة للمثيلات المُدارة في Transact-SQL.

في أماكن العمل، يتطلب مثل هذا السيناريو عادةً تشغيل منسق المعاملات الموزعة من Microsoft (MSDTC). نظراً لأن MSDTC غير متاح لتطبيق النظام الأساسي كخدمة في Azure، فقد تم الآن دمج القدرة على تنسيق المعاملات الموزعة مباشرةً في قاعدة بيانات SQL أو مثيل SQL المُدار. يمكن للتطبيقات الاتصال بأي قاعدة بيانات لبدء المعاملات الموزعة، وستقوم إحدى قواعد البيانات أو الخوادم بتنسيق المعاملة الموزعة بشفافية، كما هو موضح في الشكل التالي.

في هذه الوثيقة، تعد مصطلحات "المعاملات الموزعة" و"معاملات قاعدة البيانات المرنة" مرادفات وسيتم استخدامها بالتبادل.

Distributed transactions with Azure SQL Database using elastic database transactions

السيناريوهات الشائعة

تمكن معاملات قاعدة البيانات المرنة التطبيقات من إجراء تغييرات بسيطة على البيانات المخزنة في العديد من قواعد البيانات المختلفة. تدعم كلاً من قاعدة بيانات SQL وSQL Managed Instance خبرات التطوير من جانب العميل في C # و.NET. تتوفر تجربة من جانب الخادم (رمز مكتوب في إجراءات مخزنة أو برامج نصية من جانب الخادم) باستخدام Transact-SQL لـ SQL Managed Instance فقط.

هام

لا يتم اعتماد تشغيل معاملات قاعدة البيانات المرنة بين قاعدة بيانات Azure SQL ومثيل SQL Azure المُدار. يمكن أن تمتد معاملة قاعدة البيانات المرنة عبر مجموعة من قواعد البيانات في قاعدة بيانات SQL أو قواعد بيانات محددة عبر المثيلات المدارة.

تستهدف معاملات قاعدة البيانات المرنة السيناريوهات التالية:

  • تطبيقات قاعدة البيانات المتعددة في Azure: مع هذا السيناريو، يتم تقسيم البيانات عموديا عبر عدة قواعد بيانات في قاعدة بيانات SQL أو مثيل SQL المُدار بحيث توجد أنواع مختلفة من البيانات على قواعد بيانات مختلفة. تتطلب بعض العمليات تغييرات على البيانات، والتي يتم الاحتفاظ بها في قاعدتي بيانات أو أكثر. يستخدم التطبيق معاملات قاعدة بيانات مرنة لتنسيق التغييرات عبر قواعد البيانات وضمان آلية الرجوع.
  • تطبيقات قواعد البيانات المُقسمة في Azure: باستخدام هذا السيناريو، تستخدم طبقة البيانات مكتبة عميل قاعدة البيانات المرنة أو التقسيم الذاتي لتقسيم البيانات أفقياً عبر العديد من قواعد البيانات في قاعدة بيانات SQL أو مثيل SQL المُدار. إحدى حالات الاستخدام البارزة هي الحاجة إلى إجراء تغييرات بسيطة لتطبيق متعدد المستأجرين تمت مشاركته عندما تمتد التغييرات إلى المستأجرين. فكر على سبيل المثال في التنقل من مستأجر إلى آخر، وكلاهما يَشْغل قواعد بيانات مختلفة. الحالة الثانية هي التجزئة الدقيقة لاستيعاب احتياجات السعة لمستأجر كبير، وهذا بدوره يعني ضمنياً أن بعض العمليات الذرية تحتاج إلى أن تمتد عبر العديد من قواعد البيانات المستخدمة لنفس المستأجر. الحالة الثالثة هي التحديثات بسيطة لبيانات مرجعية يتم نسخها عبر قواعد البيانات. ويمكن الآن تنسيق العمليات البسيطة، التي يتم التعامل معها، على هذا المنوال عبر عدة قواعد بيانات. تستخدم معاملات قاعدة البيانات المرنة مرحلتين للالتزام بضمان آلية رجوع المعاملات عبر قواعد البيانات. فهي مناسبة تماماً للمعاملات التي تتضمن أقل من 100 قاعدة بيانات في وقت واحد ضمن معاملة واحدة. لا يتم فرض هذه الحدود، ولكن ينبغي للمرء أن يتوقع معدلات الأداء والنجاح لمعاملات قاعدة بيانات مرنة تعاني عند تجاوز هذه الحدود.

التثبيت والترحيل

يتم توفير إمكانيات معاملات قاعدة البيانات المرنة من خلال تحديثات مكتبات .NET System.Data.dll وSystem.Transactions.dll. تضمن مكتبات DLL استخدام الالتزام على مرحلتين عند الضرورة لضمان آلية الرجوع. لبدء تطوير التطبيقات باستخدام معاملات قاعدة بيانات مرنة، قم بتثبيت .NET Framework 4.6.1 أو إصدار أحدث. عند التشغيل على إصدار سابق من إطار عمل .NET، ستفشل المعاملات في الترقية إلى معاملة موزعة وسيظهر استثناء.

بعد التثبيت، يمكنك استخدام واجهات برمجة التطبيقات المعاملة الموزعة في System.Transactions مع اتصالات إلى قاعدة بيانات SQL ومثيل SQL المُدار. إذا كان لديك تطبيقات MSDTC الموجودة باستخدام واجهات برمجة التطبيقات هذه، فقم بإعادة إنشاء التطبيقات الموجودة لـ .NET 4.6 بعد تثبيت إطار عمل 4.6.1. إذا كانت مشروعاتك تستهدف .NET 4.6، فسوف تستخدم تلقائياً مكتبات DLL المحدثة من إصدار Framework الجديد وسينجح استدعاء API للعمليات الموزعة جنباً إلى جنب مع الاتصالات بقاعدة بيانات SQL أو مثيل SQL المُدار.

تذكر أن معاملات قاعدة البيانات المرنة لا تتطلب تثبيت منسق المعاملات الموزعة. بدلاً من ذلك، تتم إدارة معاملات قاعدة البيانات المرنة مباشرة من قبل الخدمة وداخلها. يعمل هذا على تبسيط سيناريوهات السحابة بشكل كبير نظراً لأن نشر MS DTC ليس ضرورياً لاستخدام المعاملات الموزعة مع قاعدة بيانات SQL أو مثيل SQL المُدار. يشرح القسم 4 بمزيدٍ من التفصيل كيفية نشر معاملات قاعدة البيانات المرنة وإطار عمل .NET المطلوب مع تطبيقات السحابية إلى Azure.

تثبيت .NET لـ Azure Cloud Services

يوفر Azure العديد من العروض لاستضافة تطبيقات .NET. تتوفر مقارنة بين العروض المختلفة في Azure App Service، وCloud Services، ومقارنة الأجهزة الظاهرية. إذا كان نظام التشغيل الضيف للعرض أصغر من .NET 4.6.1 المطلوب للمعاملات المرنة، فأنت بحاجة إلى ترقية نظام التشغيل الضيف إلى 4.6.1.

بالنسبة لخدمة تطبيقات Azure، لا يتم حاليا دعم الترقيات لنظام التشغيل الضيف ( Guest OS). بالنسبة إلى Azure Virtual Machines، ما عليك سوى تسجيل الدخول إلى الجهاز الظاهري وتشغيل المثبت لأحدث إطار عمل من .NET. بالنسبة إلى Azure Cloud Services، تحتاج إلى تضمين تثبيت إصدار .NET أحدث في مهام بدء التشغيل الخاصة بالنشر. تم توثيق المفاهيم والخطوات في تثبيت .NET على Cloud Service Role.

لاحظ أن المثبت لـ.NET 4.6.1 قد يتطلب تخزين مؤقت أثناء عملية نظام تمهيد تشغيل الكمبيوتر على Azure cloud services أكثر من المثبت لـ.NET 4.6. لضمان التثبيت الناجح، تحتاج إلى زيادة التخزين المؤقت لـ Azure cloud service في ملف ServiceDefinition.csdef في قسم LocalResources وإعدادات البيئة الخاصة بمهمة بدء التشغيل، كما هو موضح في النموذج التالي:

<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

تطبيقات قواعد البيانات المتعددة

يستخدم نموذج التعليمات البرمجية التالي تجربة البرمجة المألوفة مع .NET System.Transactions. تؤسس فئة TransactionScope معاملة ambient في .NET. ("المعاملة المحيطة" هي التي تعيش في مؤشر الترابط الحالي.) تشارك جميع الاتصالات المفتوحة في TransactionScope في المعاملة. في حالة مشاركة قواعد بيانات مختلفة، يتم رفع المعاملة تلقائياً إلى معاملة موزعة. يتم التحكم في نتيجة المعاملة عن طريق تحديد النطاق للإكمال للإشارة إلى الالتزام.

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

تطبيقات قواعد البيانات المشتركة

تدعم معاملات قاعدة البيانات المرنة لقاعدة بيانات SQL ومثيل SQL المُدار أيضاً تنسيق المعاملات الموزعة حيث تستخدم طريقة OpenConnectionForKey لمكتبة عميل قاعدة البيانات المرنة لفتح الاتصالات لطبقة بيانات موسّعة. خذ بعين الاعتبار الحالات التي تحتاج فيها إلى ضمان تناسق المعاملات للتغييرات عبر عدة قيم مفاتيح تقسيم مختلفة. يتم التوسط في الاتصالات بالأجزاء التي تستضيف قيم مفاتيح التجزئة المختلفة باستخدام OpenConnectionForKey. في الحالة العامة، يمكن أن تكون الاتصالات لأجزاء مختلفة بحيث يتطلب ضمان ضمانات المعاملات معاملة موزعة. يوضح نموذج التعليمات البرمجية التالي هذا الأسلوب. يفترض أن متغيراً يسمى shardmap يستخدم لتمثيل مخطط قطعة من مكتبة عميل قاعدة البيانات المرنة:

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

لا تتوفر المعاملات الموزعة من جانب الخادم باستخدام Transact-SQL إلا لمثيل Azure SQL المُدار. يمكن تنفيذ المعاملة الموزعة فقط بين المثيلات المُدارة التي تنتمي إلى نفس مجموعة ثقة الخادم. في هذا السيناريو، تحتاج المثيلات المُدارة إلى استخدام خادم مرتبط للإشارة إلى بعضها البعض.

يستخدم نموذج التعليمات البرمجية لـ Transact-SQL التالي BEGIN DISTRIBUTED TRANSACTION لبدء المعاملة الموزعة.

    -- Configure the Linked Server
    -- Add one Azure SQL Managed Instance as Linked Server
    EXEC sp_addlinkedserver
        @server='RemoteServer', -- Linked server name
        @srvproduct='',
        @provider='sqlncli', -- SQL Server Native Client
        @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 AdventureWorks2012;
    GO
    SET XACT_ABORT ON;
    GO
    BEGIN DISTRIBUTED TRANSACTION;
    -- Delete candidate from local instance.
    DELETE AdventureWorks2012.HumanResources.JobCandidate
        WHERE JobCandidateID = 13;
    -- Delete candidate from remote instance.
    DELETE RemoteServer.AdventureWorks2012.HumanResources.JobCandidate
        WHERE JobCandidateID = 13;
    COMMIT TRANSACTION;
    GO

الجمع بين خبرة تطوير .NET وTransact-SQL

يمكن لتطبيقات .NET التي تستخدم فئات System.Transaction دمج فئة TransactionScope مع جملة Transact-SQL عبارة BEGIN DISTRIBUTED TRANSACTION. داخل TransactionScope، سيتم ترقية المعاملة الداخلية التي تنفذ BEGIN DISTRIBUTED TRANSACTION بشكل صريح إلى المعاملة الموزعة. أيضا، عند فتح SqlConnecton الثاني داخل TransactionScope سيتم ترقية ضمنياً إلى المعاملة الموزعة. بمجرد بدء المعاملة الموزعة، ستنضم جميع طلبات المعاملات اللاحقة، سواء كانت قادمة من .NET أو Transact-SQL، إلى المعاملة الموزعة الأصل. نتيجة لذلك، ستنتهي جميع نطاقات المعاملات المتداخلة التي بدأها بيان BEGIN في نفس المعاملة وسيكون لبيانات COMMIT / ROLLBACK التأثير التالي على النتيجة الإجمالية:

  • لن يكون لبيان COMMIT أي تأثير على نطاق المعاملة الذي بدأه بيان BEGIN، أي أنه لن يتم الالتزام بأي نتائج قبل استدعاء طريقة Complete () في كائن TransactionScope. إذا تم إتلاف كائن TransactionScope قبل اكتماله، فسيتم إرجاع التغييرات التي تم إجراؤها داخل النطاق إلى الحالة السابقة.
  • ستؤدي عبارة ROLLBACK إلى عودة TransactionScope بالكامل إلى الحالة السابقة. ستفشل أي محاولات لإدراج معاملات جديدة ضمن TransactionScope بعد ذلك، بالإضافة إلى محاولة استدعاء Complete() في عنصر TransactionScope.

فيما يلي مثال يتم فيه ترقية المعاملة بشكل صريح إلى معاملة موزعة باستخدام Transact-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();
}

يوضح المثال التالي المعاملة التي تمت ترقيته ضمنياً إلى معاملة موزعة بمجرد بدء تشغيل SqlConnecton الثاني داخل 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();
}

المعاملات لقاعدة بيانات SQL

يتم اعتماد معاملات قاعدة البيانات المرنة عبر خوادم مختلفة في Azure SQL Database. عندما تتجاوز المعاملات حدود الخادم، يجب أولاً إدخال الخوادم المشاركة في علاقة اتصال متبادلة. بمجرد إنشاء علاقة الاتصال، يمكن لأي قاعدة بيانات في أي من الخادمين المشاركة في معاملات مرنة مع قواعد بيانات من الخادم الآخر. مع المعاملات التي تمتد لأكثر من خادمين، يجب أن تكون هناك علاقة اتصال في مكانها لأي زوج من الخوادم.

استخدم أمر PowerShell cmdlets التالي لإدارة علاقات الاتصال عبر الخوادم لمعاملات قاعدة البيانات المرنة:

  • New-AzSqlServerC CommunicationLink: استخدم أمر cmdlet هذا لإنشاء علاقة اتصال جديدة بين خادمين في Azure SQL Database. العلاقة متماثلة، ما يعني أن كلا الخادمين يمكنهما بدء المعاملات مع الخادم الآخر.
  • Get-AzSqlServerCommunicationLink: استخدام الأمر هذا cmdlet لاسترداد علاقات الاتصالات القائمة وخصائصها.
  • Remove-AzSqlServerCommunicationLink: استخدام الأمر هذا cmdlet لإزالة علاقة اتصال موجودة.

معاملات مثيل SQL المُدار

يتم اعتماد المعاملات الموزعة عبر قواعد البيانات ضمن مثيلات متعددة. عندما تتجاوز المعاملات حدود المثيل المدار، يجب أن تكون المثيلات المشاركة في علاقة أمان واتصال متبادلة. يتم ذلك عن طريق إنشاء Server Trust Group، والتي يمكن إجراؤها باستخدام مدخل Microsoft Azure أو Azure PowerShell أو Azure CLI. إذا لم تكن المثيلات على نفس الشبكة الظاهرية، فيجب عليك تكوين نظير الشبكة الظاهرية ويجب أن تسمح القواعد الواردة والصادرة لمجموعة أمان الشبكة بمنافذ 5024 و11000-12000 على جميع الشبكات الظاهرية المشاركة.

Server Trust Groups on Azure Portal

يوضح الرسم التخطيطي التاليServer Trust Group مع مثيلات المُدارة حيث يمكنها تنفيذ المعاملات الموزعة باستخدام .NET أو Transact-SQL:

Distributed transactions with Azure SQL Managed Instance using elastic transactions

مراقبة حالة المعاملة

استخدم طرق عرض الإدارة الديناميكية (DMVs) لمراقبة حالة وتقدم معاملات قاعدة البيانات المرنة المستمرة. جميع طرق عرض الإدارة الديناميكية المتعلقة بالمعاملات ذات الصلة للمعاملات الموزعة في قاعدة بيانات SQL ومثيل SQL المُدار. يمكنك العثور على القائمة المقابلة من DMVs هنا: طرق عرض ووظائف الإدارة الديناميكية ذات الصلة بالمعاملات (Transact-SQL) .

تعد طرق عرض الإدارة الديناميكية مفيدة بشكل خاص:

  • sys.dm_tran_active_transactions: سرد العمليات النشطة حالياً وحالتها. يمكن أن يحدد العمود UOW (وحدة العمل) المعاملات التابعة المختلفة التي تنتمي إلى المعاملة الموزعة ذاتها. تحمل جميع المعاملات داخل نفس المعاملة الموزعة نفس قيمة وحدة العمل. لمزيد من المعلومات، راجع وثائق طريقة عرض الإدارة الديناميكية.
  • sys.dm_tran_database_transactions: يوفر معلومات إضافية عن العمليات، مثل وضع المعاملة في السجل. لمزيد من المعلومات، راجع وثائق طريقة عرض الإدارة الديناميكية.
  • sys.dm_tran_locks: يوفر معلومات عن الأقفال التي تحتفظ بها حالياً العمليات الجارية. لمزيد من المعلومات، راجع وثائق طريقة عرض الإدارة الديناميكية.

التقييدات

تنطبق القيود التالية حالياً على معاملات قاعدة البيانات المرنة في قاعدة بيانات SQL:

  • يتم دعم المعاملات عبر قواعد البيانات في قاعدة بيانات SQL فقط. لا يمكن لموفري موارد X / Open XA وقواعد البيانات الأخرى خارج قاعدة بيانات SQL المشاركة في معاملات قاعدة البيانات المرنة. وهذا يعني أن معاملات قاعدة البيانات المرنة لا يمكن أن تمتد عبر SQL Server وAzure SQL Database في أماكن العمل. بالنسبة للمعاملات الموزعة في أماكن العمل، استمر في استخدام منسق المعاملات الموزعة.
  • يتم دعم المعاملات التي يتم تنسيقها من قبل العميل فقط من تطبيق .NET. تم التخطيط للدعم من جانب الخادم SQL مثل BEGIN DISTRIBUTED TRANSACTION، ولكنه غير متوفر بعد.
  • المعاملات عبر خدمات WCF غير مدعومة. على سبيل المثال، لديك طريقة خدمة WCF التي تنفذ معاملة ما. سيفشل تضمين المكالمة في نطاق المعاملة كـ System.ServiceModel.ProtocolException .

تنطبق القيود التالية حالياً على المعاملات الموزعة في مثيل SQL المُدار:

  • يتم اعتماد المعاملات عبر قواعد البيانات في المثيلات المدارة فقط. لا يمكن لموفري موارد وقواعد بيانات X / Open XA الأخرى خارج مثيل Azure SQL المُدار المشاركة في المعاملات الموزعة. وهذا يعني أن المعاملات الموزعة لا يمكن أن تمتد عبر SQL Server المحلي ومثيل SQL Azure المُدار. بالنسبة للمعاملات الموزعة في أماكن العمل، استمر في استخدام منسق المعاملات الموزعة.
  • المعاملات عبر خدمات WCF غير مدعومة. على سبيل المثال، لديك طريقة خدمة WCF التي تنفذ معاملة ما. سيفشل تضمين المكالمة في نطاق المعاملة كـ System.ServiceModel.ProtocolException .
  • يجب أن يكون مثيل Azure SQL المُدار جزءاً من مجموعة ثقة الخادم للمشاركة في المعاملة الموزعة.
  • تؤثر قيود مجموعات ثقة الخادم على المعاملات الموزعة.
  • تحتاج المثيلات المُدارة التي تشارك في المعاملات الموزعة إلى الاتصال عبر نقاط النهاية الخاصة (باستخدام عنوان IP الخاص من الشبكة الافتراضية حيث يتم نشرها) وتحتاج إلى الرجوع إليها بشكل متبادل باستخدام FQDNs الخاصة. يمكن لتطبيقات العميل استخدام المعاملات الموزعة على نقاط النهاية الخاصة. بالإضافة إلى ذلك، في الحالات التي تقوم فيها Transact-SQL بالاستفادة من الخوادم المرتبطة التي تشير إلى نقاط النهاية الخاصة، يمكن لتطبيقات العميل استخدام المعاملات الموزعة على نقاط النهاية العامة أيضاً. يتم شرح هذا القيد في المخطط التالي.

Private endpoint connectivity limitation

الخطوات التالية