事务如何在SpringBoot+Mybatis中使用?

同步操作才会用到

典型案例

@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)是互补关系,而非替代关系
二者在不同层面保障数据完整性,需根据架构特点选择组合方案

🔍 对比分析

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

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务