الأعراض
افترض أنك تنشئ مجموعة توفر باستخدام عبارة WITH DTC_SUPPORT = PER_DB في Microsoft SQL Server. عند محاولة تنفيذ عبارة SAVE TRANSACTION في معاملة أو إجراءات مخزنة في النظام مثل sp_executesql، تتلقى إحدى رسائل الخطأ التالية:
Msg 627, Level 16, State 0, LineNumber
لا يمكن استخدام SAVE TRANSACTION ضمن معاملة موزعة. Msg 12324, Level 16, State 100, LineNumber المعاملات الموزعة (DTC) غير معتمدة مع الجداول المحسنة للذاكرة. خطأ: 3933، الخطورة: 16، الحالة: 1. يتعذر ترقية المعاملة إلى معاملة موزعة بسبب وجود نقطة حفظ نشطة في هذه المعاملة.السبب
عند تمكين قاعدة بيانات في مجموعة قابلية وصول عالية التوفر Always On ل WITH DTC_SUPPORT = PER_DB، طالما أن المعاملة تتضمن قواعد بيانات متعددة، تتم ترقية المعاملة إلى معاملة MSDTC في SQL Server 2016 SP2 SQL Server 2017. هناك قيود في معاملات MSDTC، على سبيل المثال لا يمكن استخدام نقاط الحفظ، ولا يمكن استخدام الجداول المحسنة للذاكرة.
في بعض الحالات، لا تحدث المعاملات عبر قواعد البيانات لأن المستخدمين لديهم معاملات تتضمن قاعدتي بيانات مستخدمين، ولكن لأن المعاملات تتضمن قاعدة البيانات الحالية وقواعد بيانات النظام (الرئيسية، tempdb، النموذج، قاعدة بيانات موارد النظام). نظرا لأن قاعدة بيانات موارد النظام للقراءة فقط في الواقع، ليس من الضروري الترقية إلى معاملة MSDTC إذا كانت معاملة قاعدة البيانات المتقاطعة تتضمن قاعدة بيانات موارد النظام ولكن ليس قواعد بيانات النظام الأخرى.
الحل
يتخطى التصحيح المقدم في KB هذا الترقية إلى معاملة MSDTC إذا كانت قاعدة بيانات موارد النظام وقاعدة بيانات المستخدم التي تعد جزءا من مجموعة توفر ممكنة PER_DB DTC مضمنة في معاملة قاعدة بيانات متقاطعة داخل نفس مثيل SQL Server.
لذلك إذا كان السبب الأصلي للأخطاء المذكورة أعلاه هو المعاملة عبر قاعدة البيانات التي تتضمن قاعدة بيانات موارد النظام، فإن هذا التصحيح سيعالجه. في بعض الأحيان قد يرى المستخدم الأخطاء المذكورة أعلاه بنفس السبب الأساسي. يسرد التالي الشروط التي ينطبق عليها هذا التصحيح:
-
قاعدة البيانات هي جزء من مجموعة قابلية وصول عالية التوفر Always On ممكنة مع DTC_SUPPORT = PER_DB.
-
تتضمن معاملة قاعدة البيانات المتقاطعة قاعدة البيانات هذه وقاعدة بيانات موارد النظام في نفس مثيل SQL Server.
-
داخل معاملة قاعدة البيانات المتقاطعة، يتم استخدام SAVE TRANSACTION، أو مشاركة الجداول المحسنة للذاكرة.
قد تفشل هذه المعاملة مع الأخطاء المذكورة أعلاه دون هذا التصحيح. مع هذا التصحيح، يجب متابعة هذه المعاملة.
ملاحظة: يعالج هذا التصحيح المعاملات عبر قاعدة البيانات التي تتضمن قاعدة بيانات موارد النظام، ولكن أي معاملة عبر قاعدة البيانات تتضمن قواعد بيانات المستخدم وتحتوي على عبارة SAVE TRANSACTION ستظل تفشل ويجب إعادة كتابتها.
تم تصحيح هذه المشكلة في التحديث التراكمي التالي SQL Server:
يحتوي كل تحديث تراكمي جديد SQL Server على كافة الإصلاحات العاجلة وجميع إصلاحات الأمان التي تم تضمينها مع التحديث التراكمي السابق. اطلع على آخر التحديثات التراكمية SQL Server:
مزيد من المعلومات
معلومات إضافية حول DTC_SUPPORT = PER_DB، الجداول المحسنة للذاكرة، يمكن العثور على SAVE TRANSACTION في الارتباطات التالية.
تربط معاملات قاعدة البيانات داخل نفس مثيل SQL Server هذا الجزء ب "جداول الذاكرةالمحسنة" https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring?view=sql-server-2017#sql-server-2016-sp1-and-before-support-for-cross-database-transactions-within-the-same-sql-server-instance ربط هذا الجزء ب https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitationsربط عملية حفظ هذا الجزء https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
الحالة
أقرت Microsoft أن هذه المشكلة تحدث في منتجات Microsoft المسردة في المقطع "تنطبق على".
المراجع
تعرف على المصطلحات التي تستخدمها Microsoft لوصف تحديثات البرامج.