تخطَّ إلى المحتوى

Fail Closed

الفشل الآمن في المعاملات Fail Closed

عند فشل أي خطوة في عملية حساسة (مالية أو صلاحيات)، يجب أن يتراجع النظام لحالة آمنة (رفض/تراجع كامل) لا أن يستمر بحالة جزئية أو يسمح افتراضيًا.

مبدأ Fail Secure المعروف من [مقدمة أمن التطبيقات](/learn/api-security/00-intro)، مطبَّقًا تحديدًا على العمليات متعددة الخطوات: تحويل رصيد، إنشاء طلب مع خصم مخزون، أو تحديث صلاحيات مرتبطة بعدة جداول. لو انقطع التنفيذ بعد الخطوة الأولى فقط، يجب أن تُلغى تلقائيًا لا أن تبقى قائمة.

الأداة العملية الأهم في قواعد البيانات العلائقية: Database Transactions — تضمن أن كل الخطوات تنجح معًا أو تفشل معًا (Atomicity)، بلا حالة وسطى ممكنة.

الصياغة

db.$transaction(async (tx) => { /* كل الخطوات هنا */ })

📄 مثال

async function transferFunds(fromId, toId, amount) {
  return db.$transaction(async (tx) => {
    const from = await tx.account.update({
      where: { id: fromId },
      data: { balance: { decrement: amount } },
    });
    if (from.balance < 0) throw new Error('رصيد غير كافٍ'); // تراجع كامل تلقائي
    await tx.account.update({ where: { id: toId }, data: { balance: { increment: amount } } });
  });
}

أهم النقاط

النقطةالوظيفة
Fail Closedعند الشك أو الخطأ: ارفض/تراجع — لا تسمح افتراضيًا
Atomicityكل خطوات العملية تنجح معًا أو تفشل معًا، لا حالة وسطى
أين يُطبَّقتحويلات مالية، عمليات مخزون، أي تحديث يمس أكثر من جدول مرتبط

💡 نصائح عملية

  • غلّف أي عملية تمس أكثر من جدول واحد بـ transaction واحدة، حتى لو بدت العملية 'بسيطة' حاليًا

⚠️ أخطاء شائعة

  • تنفيذ خطوتين منفصلتين بـ await متتاليين بدل transaction واحدة، ظنًا أن الفشل نادر الحدوث

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار API-SECURITY الكامل بالعربي.