用单个 @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
难度
中级
JDK 支持
手动 JPA 事务与声明式 @Transactional
可用
自 Jakarta EE 8 / Java 11 起广泛可用
工作原理
手动事务管理需要显式的 begin()、commit() 和 rollback() 调用,通常包裹在 try/catch/finally 中。@Transactional 注解自动处理所有这些,包括异常时的回滚。
相关文档