Spring Boot / دليل حلول تحريري

تشخيص غياب المعاملة أوالتراجع المتوقع

تتبع الاستدعاء المُدار والمالك قبل تغيير الانتشار أوابتلاع الخطأ أوعد المستودع تثبيتاً للوحدة المقصودة.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

قد تبدو الدالة الموسومة بلا معاملة أوتبقى تغييرات جزئية بعد فشل، أويرتفع UnexpectedRollbackException. قد ينجح الاختبار المباشر ويختلف المُدار.

قد يتأخر SQL إلى flush أو commit؛ فلا يساوي سطر تعديل الكيان موضع الفشل. احفظ السبب ونتيجة الإكمال بدلاً من استنتاج تثبيت أوتراجع من موضع رسالة فقط.

افهم الأسباب المحتملة

  • قد يتجاوز النداء الوكيل بذاته أو new، أويختار مديراً آخر أويشارك معاملة خارجية بسياسة مختلفة.
  • قد يفتقر المتحقق لقاعدة تراجع أوتظل rollback-only بعد التقاطه، أوتمتد الآثار لموارد لا توحدها معاملة محلية. افصل هذه الأسباب قبل تجربة annotation أخرى أوإعادة كتابة البيانات.

ارسم المستدعي والحد المُدار الفعلي

سجل النسخ والمدير وهوية المصدر والتوقيع ونمط الوكيل والمستدعي والانتشار وأول فشل. لا تطبع اعتماداً أوتتصل بالمصدر المهيأ للتجربة. لا يعبر النداء الذاتي الوكيل في النمط المعتاد، وينشئ new كائناً عادياً. افحص الكائن والطريق الفعليين لا وجود الوسم في المصدر فقط؛ فقد تصف الشيفرة حداً لم يعبره الطلب الذي فشل.

صنف سياسة التراجع وحالة الإكمال

بافتراض السياسة المعتادة تتراجع غير المتحققة، وتحتاج المتحققة قاعدة مناسبة. قد تجعل مشاركة داخلية المعاملة rollback-only رغم التقاط الخارج. لا تمنع readOnly كل كتابة عموماً، وتختلف save و flush و commit. حدد هل وقعت الآثار في المورد والمعاملة نفسيهما قبل لوم الآلية؛ فليس فشل التراجع عبر خدمتين مستقلتين دليلاً على أن annotation لم تقرأ.

حدد حد خدمة وقاعدة فشل متحقق مراجعين

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

java حد معاملة توضيحي لرفض متحقق
package training.catalog;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
class OrderWriteBoundary {
    private final StockStore stock;
    private final OrderStore orders;
    OrderWriteBoundary(StockStore stock, OrderStore orders) {
        this.stock=stock; this.orders=orders;
    }
    @Transactional(rollbackFor=ReservationRejected.class)
    public void place(TrustedOrderCommand command) throws ReservationRejected {
        stock.reserve(command);
        orders.store(command);
    }
}

يلزم الاستثناء والمخزنان والسياق وتنفيذ معاملة مشتركة فعلي؛ ولم ينفذ تراجع.

أصلح الملكية وتحقق من النتيجة المخزنة

استخدم المتعاون المُدار أوتصميماً برمجياً مراجعاً، واضبط القاعدة ولا تعِد نجاحاً بعد فشل غير متعافى. لا تستخدم REQUIRES_NEW لإخفاء rollback-only؛ فهي تغير الذرية وقد تثبت السابق مستقلاً. ويحتاج الخارج صندوقاً وهوية ومنع تكرار. احفظ السبب المقيد وأعد نتيجة صادقة؛ ولا تعتبر اختفاء الاستثناء الثاني نجاحاً إذا تراجعت المعاملة أوتجزأ العمل خلاف العقد.

تحقق من نجاح الإصلاح

استدع الكائن المُدار في قاعدة اختبار معزولة مخولة، واحقن فشلاً بعد أول كتابة وافحص المخزن بعد الإكمال. اختبر نوعي الخطأ والمشاركة وفشل التثبيت والتنظيف. لا يثبت mock أونموذج Java أوغلاف اختبار معاملاتي وحده تراجع طريق الإنتاج.

امنع تكرار المشكلة

  • وثق الوحدة الذرية والمدير والمورد والمدخل والقواعد والإعادة. احفظ تكاملًا محدوداً وافصل خيط خادم HTTP عن معاملة دالة الاختبار. لا تجعل قاعدة المشروع تجربة تراجع عرضية لأن اسماً أووسماً يوحي أنه آمن.

المراجع الرسمية