如何在Spring Boot中正确使用SessionCallback执行Redis事务

小宇小哥_2134

小宇小哥_2134

2026-10-08

684人浏览

原创

sessioncallback 是 spring boot 中 redistemplate 实现事务的唯一可靠方式,通过复用同一 redisconnection 并在 execute() 内部调用 operations.multi() 和 operations.exec() 来模拟原子性,需配合 watch 实现乐观锁,异常时自动丢弃命令队列。

如何在spring boot中正确使用sessioncallback执行redis事务

SessionCallback 是唯一可靠的方式

Spring Boot 的 RedisTemplate 默认不支持事务,setEnableTransactionSupport(true) 在 Spring Data Redis 2.0+(尤其是 Lettuce 客户端)中已失效,调用 multi() + exec() 会直接抛出 java.lang.UnsupportedOperationException: Transactions not supported。真正能落地的只有 SessionCallback ——它不是“开启事务”,而是复用底层 RedisConnection,保证所有操作在同一个连接上下文中执行,从而模拟出原子性语义。

必须用 execute(SessionCallback) 而非直接调用 multi/exec

SessionCallback 的核心是把所有命令塞进同一个连接的 pipeline + multi 队列里,靠 Redis 原生的 MULTI/EXEC 机制完成提交。常见错误是:在 callback 外调用 redisTemplate.multi(),或在 callback 里混用 redisTemplate 实例(而非传入的 operations 参数)。

Automated daily memory backfill for OpenClaw sessions
Automated daily memory backfill for OpenClaw sessions

抓取并分析 OpenClaw JSONL 会话日志,重建并回填代理记忆文件。适用于:(1) 模型切换后记忆不完整,(2) 验证记忆覆盖度,(3) 重建丢失记忆,(4) 通过 cron/heartbeat 自动同步每日记忆。支持简单提取及基于 LLM 的叙事摘要,并自动清理敏感信息。

下载
  • ✅ 正确写法:只在 execute() 内部通过 operations 调用 multi()、opsForValue().set() 等,并以 operations.exec() 结尾
  • ❌ 错误写法:redisTemplate.multi() 放在 callback 外;或 callback 里写 redisTemplate.opsForValue().set(...)
  • ⚠️ 注意:callback 返回值必须是 operations.exec() 的结果(List<object></object>),否则事务不会提交

watch + SessionCallback 才算真正实现乐观锁

纯 SessionCallback 只保证命令顺序执行,不防并发修改。若需类似数据库 UPDATE WHERE version = ? 的效果,必须配合 watch。但注意:watch 必须在 operations.multi() 之前调用,且 watch 的 key 必须由 operations 实例执行(不能用外部 redisTemplate)。

  • ✅ 正确顺序:operations.watch("stock:1001") → operations.multi() → operations.opsForValue().get("stock:1001") → ... → operations.exec()
  • ❌ watch 放在 multi 之后无效;watch 用 redisTemplate.watch() 会导致连接不一致,watch 失效
  • ? exec 返回 null 表示 watch key 被其他客户端修改过,此时整个事务被丢弃,需自行重试逻辑

异常发生时事务自动回滚,但连接不会中断

在 SessionCallback.execute() 中抛出异常(如 RuntimeException),operations.exec() 不会被调用,队列里的命令全部丢弃 —— 这等效于 Redis 的事务回滚。但要注意:

  • 连接本身不受影响,后续请求仍可复用该连接
  • 不会触发 Spring 的 @Transactional 回滚(Redis 事务和 JDBC 事务完全无关)
  • 如果 callback 中部分命令已执行(比如 watch 前就调用了 set),那些操作无法撤回 —— 所以 watch 和 multi 必须紧邻,中间不要穿插非事务操作
SessionCallback 看似只是个回调接口,但它背后强制绑定连接、控制命令生命周期,是 Spring 生态里对接 Redis 事务最贴近底层语义的方式。很多人卡在“为什么 exec 没反应”,其实只是因为没意识到:事务边界完全由 execute() 方法的进出决定,而不是某行 multi() 调用。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis session spring boot

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2025.08.06

2391

22

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

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

2026.01.26

437

25

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

580

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

876

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1846

14

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

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

2023.11.02

4329

19

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

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

2023.11.14

3835

11

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

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

2024.04.02

6972

6

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

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

2024.04.07

623

6

热门下载

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

精品课程

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

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习