声明式事务

概念

通过@Transactional注解实现,由Spring AOP自动管理事务。

使用方式

@Service
@Transactional(propagation = Propagation.REQUIRED,
               isolation = Isolation.DEFAULT,
               rollbackFor = Exception.class)
public class TestServiceImpl implements TestService {
    // 所有方法继承事务配置
}

优点

  • 非侵入式设计,业务代码与事务管理解耦
  • 配置简单,易于维护
  • 减少重复代码

缺点

  • 调试相对困难(事务边界不明显)
  • 对异常处理有严格要求(默认只回滚RuntimeException)

编程式事务

概念

开发者手动编写代码管理事务,通过TransactionTemplatePlatformTransactionManager实现。

实现方式

@Service
@RequiredArgsConstructor
public class TestServiceImpl implements TestService {
    private final TransactionTemplate transactionTemplate;

    public String test01() {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try {
                    // 业务逻辑
                    unitInfoMapper.insertUnitInfo(unitInfo);
                } catch (Exception e) {
                    status.setRollbackOnly();  // 手动标记回滚
                }
            }
        });
        return "ok";
    }
}

优点

  • 控制粒度更细,灵活性高
  • 可以精确控制事务边界
  • 调试更直观

缺点

  • 代码侵入性强
  • 需要编写大量模板代码

两者对比

特性声明式事务编程式事务
实现方式基于AOPTransactionTemplate API
控制粒度较粗精细
代码侵入性

适用场景建议

  • 声明式事务:适合大多数常规业务场景
  • 编程式事务:适合需要精细控制事务边界、复杂异常处理的场景