it-swarm.asia

مهلة معاملة SQL Server

هل هناك طريقة في SQL Server 2008 R2 لإحداث مهلة لتعديل قاعدة بيانات تتضمن معاملة؟ لدينا سيناريو حيث يتعطل رمز التطبيق الخاص بنا أو يطرح استثناء ويفشل في تنفيذ التراجع أو الالتزام. يؤدي ذلك بعد ذلك إلى تعليق جلسات العمل الأخرى في انتظار اكتمال المعاملة.

9
David Gray Wright

توسيع إجابة مارك ...

عند حدوث حدث مهلة عميل (.net CommandTimeout على سبيل المثال) ، يرسل العميل "ABORT" إلى SQL Server. ثم يتخلى SQL Server ببساطة عن معالجة الاستعلام. لا يتم إرجاع أي معاملة إلى الوراء ، ولا يتم تحرير الأقفال.

الآن ، يتم إرجاع الاتصال إلى تجمع الاتصال ، بحيث لا يتم إغلاقه على SQL Server. إذا حدث هذا في أي وقت (عبر KILL أو إعادة تشغيل العميل وما إلى ذلك) ، فسيتم مسح المعاملات + الأقفال. لاحظ أن sp_reset_connection لن يمسحها أو لا يمسحها ، على الرغم من الإعلان عنها للقيام بذلك

هذه المخلفات من الإجهاض ستمنع العمليات الأخرى.

الطريقة لجعل SQL Server مسح المعاملات + التأمين على مهلة العميل (بدقة ، أحداث ABORT) هي استخدام SET XACT_ABORT ON.

يمكنك التحقق من فتح نافذة الاستعلام في SSMS:

النافذة 1:

في استعلام القائمة .. تعيين خيارات الاستعلام مهلة 5 ثوانٍ ثم تشغيل هذا

BEGIN TRAN
UPDATE sometable WITH (TABLOCKX) SET foo = foo WHERE 1 = 0;
WAITFOR DELAY '00:00:10' -- just has to be longer then timeout

نافذة 2 ، سوف ينتظر هذا إلى الأبد (أو ينتهي مهلة)

SELECT * FROM sometable

يحتوي SET XACT_ABORT ON على آثار جانبية مثيرة للاهتمام أيضًا:

  • TRANCOUNT تم تعيينه على صفر عند التراجع الضمني ولكن تم إلغاء الخطأ 266 (يحدث هذا إذا كانTRANCOUNT مختلفًا عند الدخول والخروج من proc المخزنة)
  • XACT_STATE سيكون -1 ("محكوم عليه")

يعني الجمع بين هذا أنه لا يمكنك استخدام SAVEPOINTS (على الرغم من أنني لا أذكر السلوك الدقيق) لعمليات ارتكاب/تراجع جزئي. الذي يناسبني

روابط SO على SET XACT_ABORT:

على procs المخزنة المتداخلة:

على sp_reset_connection:

20
gbn

أنا أجيب على ذلك بتردد لأنه لا توجد معلومات كافية في وصفك للمشكلة لتكون متأكدًا بنسبة 100 ٪ من أن هذه هي أفضل نصيحة. "تعليق أو يطرح استثناء" يشير إلى أن مصدر المشكلة غير مفهوم بشكل صحيح ، لذا تابع بحذر.

أبسط حل لهذا هو على الأرجح SET XACT_ABORT ON.

XACT_ABORT يحدد ما إذا كان SQL Server سيعيد المعاملة في حالة حدوث خطأ في وقت التشغيل. الافتراضي SET XACT_ABORT OFF سيتم التراجع عن العبارة التي تسببت في حدوث خطأ فقط ، وترك أي معاملة رئيسية مفتوحة.

التأثير الجانبي "gotcha" للإعداد الافتراضي هو أن المهلة الزمنية يمكن أن تسبب نفس المشكلة بالضبط ، وهي معاملة مفتوحة تقع على عاتق العملاء للتعامل معها والتراجع عنها. إذا كان العميل لا يحاول/يمسك/يتراجع ، فستبقى المعاملة مفتوحة حتى يتم الاهتمام بها (وأقتبسgbn) عنف KILL <spid>.

غالبًا ما يتم اقتباس Erland Sommarskog's مقالات عن معالجة الأخطاء في SQL Server تحتوي على كل الخلفية والإستراتيجية التي تحتاجها للتعامل مع هذه السيناريوهات والمزيد.

تعديل (التعليق التالي): لتحديد المعاملات المفتوحة ، sp_whoisactive هي على الأرجح الميزة الأكثر اكتمالًا.

11
Mark Storey-Smith