الترانزاكشن بقاعدة البيانات هي مجموعة عمليات بتتنفذ كوحدة واحدة غير قابلة للتجزئة. يا تتم كلها بنجاح ويصير Commit، يا يصير خطأ بأي منها وينعمل Rollback لكل شيء.
الترانزاكشن بتلتزم بخصائص الـ ACID. أهم خاصيتين هن:
Atomicity (الذرية): المعاملة تعتبر وحدة واحدة، إما تتم كلها أو ما تتم أبداً.
Consistency (الاتساق): بعد تنفيذ العملية، قاعدة البيانات تضل بحالة صالحة ومتوافقة مع القيود والقواعد المعرفة.
خلينا نأخذ مثال بسيط: يوزر A بده يحول 200 دولار ليوزر B.
| الخطوة | العملية |
|---|---|
| 1 | اقرأ رصيد A (1500) |
| 2 | انقص 200 من A → 1300 |
| 3 | اقرأ رصيد B (500) |
| 4 | ضيف 200 على B → 700 |
| 5 | احفظ A و B |
إذا فشلت الخطوة 4 (الإضافة لـ B) بعد ما نجحت الخطوة 2 (النقصان من A)، صار عندنا:
هاد اسمه Inconsistency وهو اللي الترانزاكشن بتمنعه.
بالدرس اللي عن إرسال الإيميل لإنشاء الحساب، صار معنا نفس المشكلة:
النتيجة: الموظف موجود بالـ Database بدون ما يوصله إيميل إنشاء الحساب. هاد الـ Inconsistency اللي ما بدناه.
التطبيق بالـ Spring Boot كثير بسيط. بنضيف @Transactional على الـ Service Method:
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Override
@Transactional
public
اشترك في النشرة البريدية
دروس جديدة، مقالات، وأدوات مباشرة لبريدك.
لما بيصير أي خطأ جوات الـ Method، الـ Transaction بينعمل له Rollback تلقائياً.
| الحالة | النتيجة |
|---|---|
بدون @Transactional وفشل الإيميل | Employee محفوظ، إيميل ما انبعث |
مع @Transactional وفشل الإيميل | Rollback، Employee ما اتحفظ |
اختبرناها عملياً:
استخدموها في أي Service Method بتعمل أكثر من عملية على قاعدة البيانات أو تتعامل مع External Services وبدكم كل شيء يصير معاً أو ما يصير أبداً. مثل:
@Transactional هي سطر واحد بالكود بيحمي تكامل بياناتكم.