同步操作才会用到
典型案例
@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
)是互补关系,而非替代关系
二者在不同层面保障数据完整性,需根据架构特点选择组合方案
🔍 对比分析
维度 | 事务 | 外键 |
---|---|---|
作用层级 | 应用层 | 数据库层 |
主要能力 | 保证操作原子性 | 保证数据参照完整性 |
生效范围 | 单个业务方法内 | 全库所有操作 |
性能影响 | 事务隔离级别影响并发 | 增删改时触发约束检查 |
架构适应性 | 适合所有架构 | 仅适合单体数据库架构 |