程序员必会-事务的失效场景及解决方案一篇

150 阅读2分钟
  • 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

今天讲这个 事务的失效场景。简单说一下这个事务

要么都成功,要么都不成功。简单直接

技术选型

springboot+MySQL+mybatis+丝袜哥(swagger)

先看看表数据

image.png

测试类
@Test
void transactional1() {
    transactionalEnd.test1();
}

方法结构

/**
 * 功能描述:事务的失效场景
 *
 * @author Songxianyang
 * @date 2022-06-24 21:25
 */
@Service
public class TransactionalEndImpl implements TransactionalEnd {
    @Resource
    private IIntEndScaleForecastMapper iIntEndScaleForecastMapper;
    
    @Override
    @Transactional
    public void test1() {
        test2();
        test3();
        test4();
        // 模拟异常
        int i = 1 / 0;
    }
    
    @Override
    public void test2() {
        IntEndScaleForecastEntity entity = new IntEndScaleForecastEntity();
        entity.setId(UUID.randomUUID().toString());
        entity.setSubProjectName("项目1");
        iIntEndScaleForecastMapper.insertIgnoreNull(entity);
    }
    
    @Override
    public void test3() {
        IntEndScaleForecastEntity entity = new IntEndScaleForecastEntity();
        entity.setId(UUID.randomUUID().toString());
        entity.setSubProjectName("项目2");
        iIntEndScaleForecastMapper.insertIgnoreNull(entity);
    }
    
    private void test4() {
        IntEndScaleForecastEntity entity = new IntEndScaleForecastEntity();
        entity.setId(UUID.randomUUID().toString());
        entity.setSubProjectName("项目3");
        iIntEndScaleForecastMapper.insertIgnoreNull(entity);
    }
}

事务失效场景1:private 修饰方法 失效(回头分析源码)再给大家解释

image.png

仔细看直接飘红了 编译器提示您这样写有问题

事务失效场景2:final 关键字

image.png

仔细看直接飘红了 编译器提示您这样写有问题

失效场景之方法内部调用

声明:test1去调用test2 以此类推

    • test1 有事务注解 test 2 没有事务注解(不关心是否是什么修饰) 生效
    • test1 没事务注解 test2 有事务注解 不生效
    • test1 没事务注解 test2 没事务注解 不生效
    • test1 有事务注解 test3 有事务注解 生效

方法的内部调用就上升到事务的传播行为了,其实 UP主也要学习一下这个事务的传播行为哈哈 今天先不讲这个哈!

行了 下一篇接着写

  • 面向礼品编写博客,哈哈
参考文献:

在企业级开发过程中我发现有位同事用select * from where 条件 for update

这几个事务失效的场景,你知道吗?

聊聊 spring 事务失效的 12 种场景,太坑了

都是不错的文章