【技术笔记】Spring事务失效-常见的Spring事务失效场景

Spring事务失效

常见的Spring事务失效场景

  1. 方法访问权限不是public

    // 错误示例
    @Transactional
    protected void saveData() {
        // 事务不会生效
    }
    
    // 正确示例
    @Transactional
    public void saveData() {
        // 事务会正常生效
    }
    
  2. 同一个类中方法调用

    @Service
    public class UserService {
        // 直接调用同类中的@Transactional方法,事务会失效
        public void processData() {
            this.saveUser(); // 事务不生效
        }
        
        @Transactional
        public void saveUser() {
            // 保存用户逻辑
        }
    }
    
  3. try-catch吞掉异常

    @Transactional
    public void saveData() {
        try {
            // 数据库操作
        } catch (Exception e) {
            // 吞掉异常,事务不会回滚
        }
    }
    
  4. 手动抛出检查异常但未指定rollbackFor

    // 错误示例
    @Transactional
    public void saveData() throws Exception {
        // 操作
        throw new Exception("error"); // 默认只对RuntimeException回滚
    }
    
    // 正确示例
    @Transactional(rollbackFor = Exception.class)
    public void saveData() throws Exception {
        // 操作
        throw new Exception("error");
    }
    
  5. 数据库引擎不支持事务

    • MySQL的MyISAM存储引擎不支持事务

解决方案

Spring事务失效解决方案:
  • 确保@Transactional注解的方法是public的
  • 跨类调用事务方法
  • 正确处理异常,不要吞掉异常
  • 根据业务需要指定rollbackFor属性
  • 确保数据库引擎支持事务
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值