MyBatis 缓存与 Spring 事务相关笔记

一、MyBatis 缓存

  1. 缓存作用:减少对数据库的访问,提高查询效率。当进行两次相同的查询时,可直接使用缓存数据。
  2. 一级缓存
    • 默认开启
    • 级别:SQLSession 级别
    • 特点:必须是同一个 SQLSession 才会使用到缓存
  3. 二级缓存
    • 需要手动开启,使用<cache>标签启用
    • 级别:Mapper 级别
    • 特点:使用同一个 Mapper 查询同一个 SQL 且参数相同时,会击中缓存;二级缓存的数据需要可序列化

二、Spring 事务实现方式

  1. 编程式事务

    • 通过TransactionTemplate实现
    • 示例代码:
    java 复制代码
    @Autowired
    TransactionTemplate tt;
    
    @RequestMapping("testa")
    public void testTransaction(){
        tt.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try{
                    // 业务操作
                    // ...
                } catch (Exception e) {
                    status.setRollbackOnly(); // 发生异常时回滚
                }
            }
        });
    }
  2. 声明式事务

    • 通过@Transactional注解实现
    • 示例代码:
    java 复制代码
    @RequestMapping("testb")
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.DEFAULT)
    public void testTransactionB(){
        // 业务操作
        // ...
    }

三、事务隔离级别

  • Isolation.DEFAULT:默认,跟随连接的数据库的隔离级别
  • 其他级别:读未提交、读已提交、可重复读、串行化

四、事务失效的情况

  1. 事务传播行为设置有问题(如nevernot_supported,以非事务方式运行)
  2. 数据库不支持事务(如使用 MyISAM 存储引擎的表)
  3. 方法的访问权限修饰符影响动态代理重写 / 调用此方法
  4. 在类的内部调用自身的方法(this调用,非动态代理对象)

五、Spring 事务传播行为(7 种)

  1. Propagation.REQUIRED(默认)
    • 若外部有事务,就加入事务;若外部没有事务,创建新事务独立运行
  2. Propagation.SUPPORTS(拥护)
    • 若已有事务,加入事务;若没有事务,以非事务处理
  3. Propagation.MANDATORY(强制的)
    • 若有事务,加入;若没有,抛出异常
  4. Propagation.REQUIRES_NEW(必须独立)
    • 若有事务,挂起当前事务,创建新事务;若没有,创建事务
  5. Propagation.NOT_SUPPORTED(不拥护)
    • 若有事务,挂起,当前方法以非事务方式运行;若没有,以非事务方式运行
  6. Propagation.NEVER(不能有事务)
    • 若有事务,抛出异常;若没有,以非事务方式运行
  7. Propagation.NESTED(嵌套)
    • 若有事务,嵌套事务运行;若没有,创建新事务
相关推荐
qq_12498707535 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_5 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.5 小时前
Day06——权限认证-项目集成
java
瑶山5 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy5 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_818732065 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
2501_941982055 小时前
深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?
java·golang·企业微信
码字的字节5 小时前
Spring Cloud服务注册与发现(一):手把手搭建Eureka Server,详解高可用配置
spring·spring cloud·eureka
大厂资深架构师5 小时前
Spring Cloud Eureka在后端系统中的服务剔除策略
spring·spring cloud·ai·eureka
马猴烧酒.5 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库