Enterprise متوسط

معاملة JPA اليدوية مقابل @Transactional التصريحية

استبدل كتل begin/commit/rollback المطوّلة بتعليق توضيحي @Transactional واحد.

✕ Java EE
@PersistenceContext
EntityManager em;

public void transferFunds(Long from, Long to,
                          BigDecimal amount) {
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    try {
        Account src = em.find(Account.class, from);
        Account dst = em.find(Account.class, to);
        src.debit(amount);
        dst.credit(amount);
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
        throw e;
    }
}
✓ Jakarta EE 8+
@ApplicationScoped
public class AccountService {
    @PersistenceContext
    EntityManager em;

    @Transactional
    public void transferFunds(Long from, Long to,
                              BigDecimal amount) {
        var src = em.find(Account.class, from);
        var dst = em.find(Account.class, to);
        src.debit(amount);
        dst.credit(amount);
    }
}
هل ترى مشكلة في هذا الكود؟ أخبرنا.
🗑️

لا كليشيه

تعليق توضيحي واحد يستبدل كتل try-catch المتكررة لـ begin/commit/rollback.

🛡️

تراجع أكثر أماناً

الحاوية تضمن التراجع عن الاستثناءات غير المفحوصة — لا خطر نسيان كتلة catch.

📐

تحكم تصريحي

قواعد الانتشار والعزل والتراجع مُعبَّر عنها كسمات تعليق توضيحي.

الأسلوب القديم
معاملة يدوية
الأسلوب الحديث
@Transactional
منذ JDK
11
الصعوبة
متوسط
معاملة JPA اليدوية مقابل @Transactional التصريحية
متاح

متاح على نطاق واسع منذ Jakarta EE 8 / Java 11

تتطلب إدارة المعاملات اليدوية استدعاءات صريحة لـ begin() و commit() و rollback() مغلّفةً في كتل try-catch — كل دالة خدمة تكرر هذه الكليشيهات. يفوّض التعليق التوضيحي @Transactional إدارة دورة الحياة إلى الحاوية: تبدأ معاملةً قبل الدالة وتُودعها عند النجاح وتتراجع عنها عند RuntimeException تلقائياً.

مشاركة 𝕏 🦋 in