Enterprise 中级

手动 JPA 事务与声明式 @Transactional

用单个 @Transactional 注解替代冗长的 begin/commit/rollback 块。

✕ 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);
    }
}
发现此代码有问题? 告诉我们。
🗑️

无样板代码

一个注解替代重复的 begin/commit/rollback try-catch 块。

🛡️

自动回滚

未检查异常时自动回滚——无需手动 catch 块。

🔧

可配置

传播、隔离、超时和只读通过注解属性控制。

旧方式
手动事务
现代方式
@Transactional
自 JDK
11
难度
中级
手动 JPA 事务与声明式 @Transactional
可用

自 Jakarta EE 8 / Java 11 起广泛可用

手动事务管理需要显式的 begin()、commit() 和 rollback() 调用,通常包裹在 try/catch/finally 中。@Transactional 注解自动处理所有这些,包括异常时的回滚。

分享 𝕏 🦋 in