专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
今天看啥  ›  专栏  ›  芋道源码

当 Redis 碰上 @Transactional,有大坑,要注意!

芋道源码  · 公众号  · Java  · 2024-09-17 18:45

主要观点总结

文章介绍了关于一个生产环境中遇到的Redis递增操作返回null的问题的排查和修复过程。文章首先描述了问题的现象和初步排查,然后详细描述了针对问题的多种推测和验证过程,最后给出了问题的原因和两种修复方案。

关键观点总结

关键观点1: 问题描述

生产环境中每天早上客服人员在后台创建客服事件时,都会遇到Redis递增操作返回null的问题,导致后续逻辑出错,保存客服事件失败。重启微服务后恢复正常。

关键观点2: 初步排查

初步怀疑是Redis的自增操作在某种情况下返回null,如大量Redis连接未释放、Redis事务等。

关键观点3: 详细排查

详细分析了Redis的递增操作在什么情况下会返回null,包括推测一(大量Redis连接未释放)、推测二(Redis事务造成的问题)、推测三(开启Redis事务支持后,在@Transactional中执行的Redis命令被放入事务队列)。通过验证,发现只有开启了Redis事务支持并在@Transactional中执行Redis命令时,Redis的递增操作会返回null。

关键观点4: 问题原因

当开启了Redis事务支持且添加了@Transactional注解后,Redis的命令会被认为是放在事务队列中执行,递增命令返回null,需要等待事务提交时才会执行。这是导致问题的根本原因。

关键观点5: 解决方案

提供了两种解决方案:方案一(每次Redis事务操作完成后关闭Redis事务支持),方案二(创建两个StringRedisTemplate,一个用于执行Redis事务,一个用于执行普通命令)。最终选择了方案二,通过创建两个Bean分别处理事务和普通命令,成功解决了问题。


文章预览

👉 这是一个或许对你有用 的社群 🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入 「 芋道快速开发平台 」 知识星球。 下面是星球提供的部分资料:   《项目实战(视频)》 :从书中学,往事上 “练 ” 《互联网高频面试题》 :面朝简历学习,春暖花开 《架构 x 系统设计》 :摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》 :系统学习,互联网主流技术栈 《必读 Java 源码专栏》 :知其然,知其所以然 👉 这是一个或许对你有用的开源项目 国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。 功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能: Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览