当前位置: 首页 > news >正文

思途spring学习0807

一、Spring 事务管理(Transaction Management)

1. 事务基本配置步骤

Spring Boot 中使用声明式事务非常简单,只需三步:

✅ 步骤一:引入依赖(通常已包含)
<!-- spring-boot-starter-data-jpa 或 mybatis-spring-boot-starter 已包含 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

⚠️ 实际上 spring-boot-starter-* 数据相关 starter 已默认集成事务支持,无需手动添加 AOP 依赖(但底层依赖 AOP 实现)。


✅ 步骤二:启用事务支持

在主启动类或配置类上添加 @EnableTransactionManagementSpring Boot 2.x+ 可省略,自动启用):

@SpringBootApplication
@EnableTransactionManagement  // 可选,Spring Boot 默认开启
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

✅ 步骤三:使用 @Transactional 注解

标注在 Service 层的方法 上(不建议在 Controller 使用):

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void transferMoney(Long fromId, Long toId, BigDecimal amount) {userMapper.decreaseBalance(fromId, amount);// 模拟异常if (amount.compareTo(BigDecimal.TEN) > 0) {throw new RuntimeException("金额过大,转账失败");}userMapper.increaseBalance(toId, amount);}
}

✅ 效果:若方法中抛出异常(默认检查 RuntimeException 和 Error),事务将回滚;否则提交。


2. 事务隔离级别(Isolation Level)

隔离级别说明存在问题
READ_UNCOMMITTED读未提交脏读、不可重复读、幻读
READ_COMMITTED读已提交不可重复读、幻读
REPEATABLE_READ可重复读幻读(部分数据库可避免)
SERIALIZABLE串行化性能极低,排队执行

🔺 安全性递增,性能递减
🔹 默认值:ISOLATION_DEFAULT → 使用数据库默认隔离级别(MySQL 默认为 REPEATABLE_READ

@Transactional(isolation = Isolation.READ_COMMITTED)
public void method() { ... }

3. 事务传播机制(Propagation Behavior)

Spring 定义了 7 种传播行为,控制多个事务方法调用时的事务边界。

传播行为说明使用场景
REQUIRED(默认)必须有事务。若已有则加入,否则新建增删改操作(CRUD-write)
SUPPORTS支持事务。有则加入,无则非事务执行查询方法(只读)
MANDATORY必须运行在事务中,否则抛异常强制要求调用者开启事务
REQUIRES_NEW总是新建事务,挂起当前事务日志记录、独立操作
NOT_SUPPORTED不支持事务,挂起当前事务批量导入等耗时操作
NEVER不支持事务,若有事务则抛异常确保非事务环境运行
NESTED嵌套事务。外层回滚,内层也回滚;内层可独立回滚复杂业务逻辑中的子事务控制

📌 示例:

@Service
public class BusinessService {@Autowiredprivate LogService logService;@Transactional(propagation = Propagation.REQUIRED)public void businessMethod() {// 主业务逻辑doBusiness();// 即使主事务失败,日志仍需记录logService.saveLog(); // 内部使用 REQUIRES_NEW}
}@Service
public class LogService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void saveLog() {// 新建事务,独立提交}
}

二、Spring 缓存机制(Caching Abstraction)

基于 AOP + 注解 实现,统一抽象缓存操作,支持多种缓存实现(如 Caffeine、Redis、EhCache 等)。


1. 核心注解

注解作用
@EnableCaching启用 Spring 缓存支持(加在启动类或配置类)
@Cacheable方法执行前查缓存,命中则不执行方法
@CachePut方法执行后更新缓存,总是执行方法
@CacheEvict清除缓存(可清单个或全部)
@CacheConfig类级别缓存配置(统一 cacheNames、keyGenerator 等)

2. Spring Boot 整合 Redis 缓存

✅ 步骤一:引入依赖
<!-- Spring Data Redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><!-- Spring Cache 抽象 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

✅ 步骤二:配置文件(application.yml)
spring:# Redis 配置data:redis:host: localhostport: 6379password: 123456database: 0timeout: 1sconnect-timeout: 3slettuce:pool:max-active: 8max-idle: 8min-idle: 0# 缓存配置cache:type: redisredis:time-to-live: 4h           # 缓存过期时间(TTL)cache-null-values: false   # 是否缓存 null 值cache-names: userCache, deptCache  # 预定义缓存名称

✅ 步骤三:启用缓存
@SpringBootApplication
@EnableCaching  // 启用缓存
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

✅ 步骤四:使用缓存注解
@Service
@CacheConfig(cacheNames = "userCache")  // 统一指定缓存名
public class UserService {@Autowiredprivate UserMapper userMapper;// 查询时先查缓存,key = userId@Cacheable(key = "#id")public User findById(Long id) {System.out.println("查询数据库...");return userMapper.findById(id);}// 更新后同步更新缓存@CachePut(key = "#user.id")public User update(User user) {userMapper.update(user);return user; // 返回值会自动放入缓存}// 删除用户,同时清除缓存@CacheEvict(key = "#id")public void deleteById(Long id) {userMapper.deleteById(id);}// 清空整个缓存@CacheEvict(allEntries = true)public void clearCache() {// ...}
}

3. Redis 五大数据类型简介

类型特点应用场景
String字符串缓存、计数器、分布式锁
List有序、可重复消息队列、最新消息列表
Set无序、不重复好友标签、共同关注
ZSet (Sorted Set)有序集合,带 score 排序排行榜、延迟队列
Hash键值对集合存储对象(如用户信息)

🔍 示例:用 Hash 存储用户信息

opsHash.put("user:1001", "name", "张三");
opsHash.put("user:1001", "age", "25");

4. 缓存过期策略(TTL - Time To Live)

  • Redis 支持设置键的过期时间,单位秒或毫秒。
  • Spring Cache 中通过 time-to-live 配置全局 TTL。
  • 可在注解中单独设置:
@Cacheable(key = "#id", ttl = 3600) // 单独设置过期时间(需自定义 CacheManager)

三、Caffeine vs Redis

对比项Caffeine(本地缓存)Redis(分布式缓存)
存储位置JVM 内存独立服务
速度极快(纳秒级)快(毫秒级)
容量受限于 JVM大(可集群扩展)
一致性单机一致分布式一致
适用场景高频读、低变更数据共享数据、跨服务缓存

✅ 推荐组合使用:Caffeine + Redis(多级缓存)


四、最佳实践与注意事项

✅ 事务使用建议

  • 标注在 public 方法 上(AOP 代理限制)。
  • 避免在 private、final、static 方法上使用。
  • 异常要抛出,才能触发回滚。
  • 自调用(this.method())不会触发事务(代理失效)。

✅ 缓存使用建议

  • 合理设置 TTL,避免数据陈旧。
  • 缓存穿透:加空值缓存或布隆过滤器。
  • 缓存雪崩:设置随机过期时间。
  • 缓存击穿:热点数据加互斥锁。
  • 使用 @CacheConfig 统一管理缓存配置。

五、总结对比表

功能事务(Transaction)缓存(Caching)
实现机制AOP + PlatformTransactionManagerAOP + CacheManager
核心注解@Transactional@Cacheable@CachePut@CacheEvict
配置注解@EnableTransactionManagement@EnableCaching
性能影响回滚代价高显著提升读性能
典型场景数据一致性保障减少数据库压力

📌 学习建议

  • 动手实践事务传播行为(如 REQUIRED vs REQUIRES_NEW)。
  • 使用 Redis Desktop Manager 查看缓存数据。
  • 结合日志观察缓存命中情况。
  • 理解 AOP 是事务和缓存的底层支撑机制。

Spring 事务 + 缓存 = 高可用、高性能应用的基石!

http://www.dtcms.com/a/319101.html

相关文章:

  • Java -- Arrays类-- System类-- BigInteger和BigDecimal类
  • 串口通信02 温度传感DS18B20 01 day49
  • jetson上使用opencv的gstreamer进行MIPI和USB摄像头的连接以及udp推流
  • JAVA,Maven分模块设计
  • 语言模型(LM):n-gram模型原理与困惑度(Perplexity)计算详解
  • B-树与B+树
  • AI大模型专题:LLM大模型(初识)
  • dubbo的metadata-report是做啥的
  • 17.11 单卡24G显存微调GLM-4实战:QLoRA到全参数调优,准确率狂飙42.7%
  • Qt: WA_DontCreateNativeAncestors
  • 【缩点 拓扑序】P3119 [USACO15JAN] Grass Cownoisseur G|省选-
  • 【关于Java中==和equals( )和hashCode( )三者异同】
  • 写Rust GPU内核驱动:GPU驱动工作原理简述
  • 【性能测试】---测试工具篇
  • 医疗人效管理新标杆:盖雅工场如何赋能健康服务企业提质增效
  • 「iOS」————自动释放池底层原理
  • CSS包含块与百分比取值机制完全指南
  • 数据分析——Pandas库
  • 添加内容溢出时显示完整内容提示的功能
  • QT5.15 mingw
  • c++之 栈浅析
  • Python 数据类型及数据类型转换
  • platform总线简介和使用场景说明
  • 基于Ruby的IP池系统构建分布式爬虫架构
  • 《算法导论》第 9 章 - 中位数和顺序统计量
  • 网页图片视频一键下载+视频去重修改 ,覆盖B站等多个平台
  • 【基础知识】springboot+vue 基础框架搭建(更新中)
  • 中国MCP市场:腾讯、阿里、百度的本土化实践
  • AI绘画:生成唐初李世民全身像提示词
  • 前后端加密传数据实现方案