讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

在Spring Boot中怎样通过RedisTemplate执行事务操作?

星宇君_9553

星宇君_9553

发布时间:2026-11-10 06:51:31

|

374人浏览过

|

来源于php中文网

原创

RedisTemplate直接调用multi()会抛UnsupportedOperationException,因其multi()为空实现;必须在SessionCallback内通过operations.multi()调用,才能绑定连接并启用事务队列。

在spring boot中怎样通过redistemplate执行事务操作?

RedisTemplate 本身不支持原生事务语义,必须用 SessionCallback 或 RedisOperations 手动封装 MULTI/EXEC 流程,否则调用 multi() 会直接抛 UnsupportedOperationException。

为什么直接调用 redisTemplate.multi() 会报错

因为 RedisTemplate 的 multi() 方法默认是空实现(委托给 RedisConnection,而 Lettuce/Jedis 的连接实例在非回调上下文中不支持交互式事务模式)。你看到的“开启事务”动作,只有在 SessionCallback 或 RedisCallback 内部执行时,才会真正绑定到当前连接并启用队列缓冲。

常见错误现象:java.lang.UnsupportedOperationException: RedisTemplate.multi() is not supported in standalone mode —— 这不是配置问题,是调用位置错了。

  • 必须在 redisTemplate.execute(...) 回调内调用 operations.multi()
  • 不能在 service 方法体里直接写 redisTemplate.multi()
  • opsForValue().set(...) 等操作也必须通过 operations 实例调用,而非原始 redisTemplate

SessionCallback 是唯一推荐的事务入口

它保证整个回调逻辑运行在同一个 RedisConnection 上,且自动处理连接获取/释放,避免手动管理资源。相比 RedisCallback,SessionCallback 还提供 RedisOperations 封装,能直接使用 opsForXxx(),写法更贴近日常开发习惯。

示例关键片段:

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
redisTemplate.execute(new SessionCallback<Object>() {
    @Override
    public Object execute(RedisOperations operations) throws DataAccessException {
        operations.multi(); // ✅ 正确:在 callback 内调用
        operations.opsForValue().set("a", "1");
        operations.opsForValue().set("b", "2");
        operations.exec(); // 提交;若中途异常,需手动 discard
        return null;
    }
});
  • 不要在 try 外写 exec(),否则异常时事务已提交
  • 捕获异常后必须显式调用 operations.discard(),否则连接可能卡在 MULTI 状态
  • 返回值由你自己决定,exec() 结果是 List<object></object>,包含每条命令的响应

WATCH + SessionCallback 实现乐观锁

Redis 事务不自带行级锁,靠 WATCH 监视 key 变化来实现“检查-执行”原子性。这个操作只能在 SessionCallback 内完成,且必须在 multi() 之前调用。

典型场景:库存扣减防超卖

redisTemplate.execute(new SessionCallback<Boolean>() {
    @Override
    public Boolean execute(RedisOperations operations) throws DataAccessException {
        operations.watch("stock:1001"); // ✅ 必须在 multi 前
        String stock = operations.opsForValue().get("stock:1001");
        if (Integer.parseInt(stock) > 0) {
            operations.multi();
            operations.opsForValue().decrement("stock:1001");
            List<Object> result = operations.exec(); // 若 stock 被改,result == null
            return result != null;
        }
        return false;
    }
});
  • WATCH 后如果其他客户端修改了被监视 key,exec() 返回 null,不是异常
  • 务必检查 exec() 返回值,null 表示事务被放弃,需重试或降级
  • 不能把 WATCH 和业务逻辑(如查库存)拆到两个 callback 里,会丢失原子性

事务失败后没有回滚,只有丢弃

Redis 事务没有 RDBMS 那样的回滚机制。一旦 exec() 开始执行,队列中命令按序执行,某个命令失败(如对 string 执行 ZADD)不会中断后续命令,也不会撤销前面已成功的操作。

这意味着:

  • 事务内应尽量避免混合数据类型操作,减少单点失败风险
  • 不要依赖“全部成功或全部失败”,要为每个命令的失败单独处理(比如检查 decr() 返回值是否为负)
  • 如果业务强依赖 ACID,Redis 事务不适合,考虑用 Lua 脚本或外部协调服务

最容易被忽略的一点:事务不是万能锁。WATCH 只对 key 生效,无法覆盖复杂条件判断;multi/exec 之间的时间窗口仍可能被并发写入绕过——真正安全的方案往往需要结合应用层重试+幂等设计。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2911

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

517

2026.01.26

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4889

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4455

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

8612

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

663

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

776

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

8902

2024.04.07

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn