同步操作才会用到

典型案例

@Service
public class OrderService {
    
    @Autowired
    private OrderRepository orderRepo;
    
    @Autowired
    private InventoryRepository inventoryRepo;
    
    @Autowired
    private PaymentRepository paymentRepo;
    
    // 典型的事务应用:创建订单需要操作多个表,必须保证原子性
    @Transactional
    public void createOrder(Order order) {
        // 1. 扣减库存
        inventoryRepo.reduceStock(order.getProductId(), order.getQuantity());
        
        // 2. 创建订单记录
        orderRepo.save(order);
        
        // 3. 创建支付记录
        paymentRepo.createPayment(order.getOrderId(), order.getAmount());
        
        // 如果以上任何一步失败,之前的所有操作都会回滚
    }
}

Spring Boot 默认已启用事务管理,你只需在启动类上添加 @EnableTransactionManagement,在需要使用事务的地方使用@Transactional注解

有事务是不是不需要外键了?

事务与外键的对比与选择结果

📌 核心结论

事务(@Transactional)和外键(FOREIGN KEY)是互补关系,而非替代关系
二者在不同层面保障数据完整性,需根据架构特点选择组合方案

🔍 对比分析

维度 事务 外键
作用层级 应用层 数据库层
主要能力 保证操作原子性 保证数据参照完整性
生效范围 单个业务方法内 全库所有操作
性能影响 事务隔离级别影响并发 增删改时触发约束检查
架构适应性 适合所有架构 仅适合单体数据库架构