Jinx

一只奶牛猫

Transactional 注解

发布于 # java

@Transactional 注解

问题分类

  1. 不必要
  • 无需事务的业务: 例如查询或HTTP请求方法。
  • 事务范围过大: 将注解加在类或抽象类上,导致所有方法被事务管理。
  1. 不生效
  • 方法权限问题: 不应在 private 方法上使用 @Transactional
  • finalstatic 修饰的方法: 这些方法不会被代理。
  • 同类内部方法调用: 事务不会生效,因为调用不经过代理。
  • Bean 未被 Spring 管理: 必须由 Spring 管理。
  • 异步线程调用: 事务状态不跨线程传递。
  1. 不回滚
  • 用错传播属性: 如 REQUIRED, MANDATORY, NEVER, REQUIRES_NEW, NESTED, SUPPORTS, NOT_SUPPORTED
  • 自己吞了异常: 捕获异常后未重新抛出。
  • 事务无法捕获的异常: 如 Exception 而非 RuntimeException
  • 自定义异常范围问题: 异常类型未正确设置。

传播属性详解

  • REQUIRED: 默认行为,根据当前事务状态决定是否创建新事务。
  • MANDATORY: 必须在事务中调用,否则抛出异常。
  • NEVER: 非事务性执行,存在事务则抛出异常。
  • REQUIRES_NEW: 总是创建新事务,挂起当前事务。
  • NESTED: 嵌套事务,子事务依赖父事务。
  • SUPPORTS: 支持事务,不存在则非事务方式执行。
  • NOT_SUPPORTED: 非事务方式执行,存在事务则挂起。

总结

  • 正确理解和使用 @Transactional 注解对于确保事务正确回滚和性能优化至关重要。
  • 应避免不必要的事务使用,确保事务注解在正确的方法上生效,并正确处理异常以保证事务能够按预期回滚。