في 13 مارس، تم إصدار نسخة تصحيحية من الإصدار 3.51.3 من نظام إدارة قواعد البيانات المدمج المضغوط. سكليتيتمت كتابة كود المشروع بلغة C وهو متاح للتوزيع في المجال العام.
بسبب مشاكل التوافق مع الإصدارات السابقة لبعض الميزات الجديدة، الإصدار 3.52.0 تم سحب (الذي صدر في 6 مارس).
قائمة التغييرات في الإصدار 3.51.3:
- في الثالث من مارس، اكتشف أحد مطوري SQLite (دان) خطأً برمجيًا وقام بإصلاحه، وهو خطأ قد يؤدي في حالات نادرة إلى تلف قاعدة البيانات، ويُسمى خطأ في إعادة ضبط سجل العمليات:
- يحدث هذا الخطأ فقط في قواعد البيانات التي تعمل في وضع WAL إذا كان هناك اتصالان أو أكثر مفتوحان لنفس الملف في سلاسل عمليات أو عمليات مختلفة، وإذا حاول الاتصالان الكتابة أو إنشاء نقطة تحقق في نفس الوقت.
- يرتبط هذا الخطأ بتعارض في الوصول إلى البيانات في ظل قيود زمنية صارمة. في الظروف التشغيلية العادية، يحدث هذا الخطأ نادرًا للغاية. لم يتمكن المطورون من إعادة إنتاج الخطأ في بيئة التشغيل الفعلية، مما اضطرهم إلى إضافة منطق اختبار خاص إلى SQLite يُهيئ الظروف عمدًا لحدوث الخطأ لضمان حل المشكلة.
- يحدث الخطأ عندما:
- يقوم أحد الاتصالات بإجراء نقطة تحقق. يجب أن تكتمل نقطة التحقق الأولى هذه. بمعنى آخر، يجب أن تنجح نقطة التحقق في نسخ جميع محتويات ملف WAL إلى قاعدة البيانات، وإعادة ملف WAL إلى حالة تسمح بتفريغه.
- مباشرة بعد اكتمال نقطة التفتيش الأولى، يتم إطلاق نقطة التفتيش الثانية.
- أثناء تشغيل نقطة التحقق الثانية من الخطوة 2، يقوم اتصال قاعدة بيانات آخر بتنفيذ معاملة تقوم بتفريغ ملف WAL وكتابة محتويات جديدة في بداية ملف WAL.
- بسبب تعارض في الوصول إلى البيانات، لم تأخذ نقطة التحقق الثانية من الخطوة 2 في الحسبان أن ملف WAL قد تم تفريغه نتيجةً لعملية تأكيد المعاملة في الخطوة 3. وقد عيّنت نقطة التحقق الثانية قيمةً غير صحيحة لأحد الحقول في رأس فهرس WAL. يشير هذا الحقل إلى أن جزءًا من ملف WAL قد تم تأكيده بالفعل عند نقطة التحقق، على الرغم من أن هذا لم يكن صحيحًا في الواقع.
- يؤدي تنفيذ معاملات إضافية إلى زيادة عدد الصفحات في ملف WAL بما يتجاوز عدد الصفحات الموجودة في وقت نقطة التحقق الأولى في الخطوة 1.
- لاحقًا، عندما تحدث نقطة التفتيش الثالثة، فإنها تتخطى كل أو جزء من المعاملة المكتوبة في المرحلة 3. وبالتالي، فإن أجزاء من المعاملة من المرحلة 3 لا تصل أبدًا إلى ملف قاعدة البيانات، مما يؤدي إلى تلف ملف قاعدة البيانات.
- يبدو أن الخلل موجود في جميع إصدارات SQLite، بدءًا من الإصدار 3.7.0 (2010-07-21) وانتهاءً بالإصدار 3.51.2. كما تم إصدار تحديثات عاجلة لبعض الإصدارات السابقة. 3.44.6 и 3.50.7.
- إصلاحات طفيفة أخرى.
المصدر: linux.org.ru
