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 الكامل بالعربي.