io.lettuce.core.RedisCommandExecutionException: ERR EXEC without MULTI

这篇具有很好参考价值的文章主要介绍了io.lettuce.core.RedisCommandExecutionException: ERR EXEC without MULTI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在使用redisTemplate的事务功能时,代码运行抛出异常:

io.lettuce.core.RedisCommandExecutionException: ERR EXEC without MULTI
	at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:147)
	at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:116)
	at io.lettuce.core.protocol.AsyncCommand.completeResult(AsyncCommand.java:120)
	at io.lettuce.core.protocol.AsyncCommand.complete(AsyncCommand.java:111)
	at io.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:747)
	at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:682)
	at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:599)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(Thread.java:748)

出现上面这个异常的原因是在执行redis事务时,执行exec命令时没有检查到multi命令;这是因为redis需要所有命令都在一个连接上提交才能判断到命令是否执行,而默认使用连接池提交命令时不能保证所有命令都在一个连接上提交。为了解决这个问题,在springboot中需要在方法上面添加@Transactional注解,并且方法内设置开启事务支持,方法代码如下:

@Transactional
public void runTransaction() {
    // 开启事务支持
    redisTemplate.setEnableTransactionSupport(true);
    // 表示开启事务
    redisTemplate.multi();

    // 执行多个redis命令
    redisTemplate.opsForValue().set("key1", "value1");
    redisTemplate.opsForValue().set("key2", "value2");
    redisTemplate.opsForValue().set("key3", "value3");

    // 提交执行
    redisTemplate.exec();
    // 取消执行
    // redisTemplate.discard();
    // 关闭事务支持
    redisTemplate.setEnableTransactionSupport(false);
}

上面代码还需要注意事务方法不能在同一个类内部调用,@Transactional 注解需要代理才能生效,否则事务还是不生效,上面的异常依然会抛出。
上面这种处理事务方式不太推荐,在redisTemplate中建议使用SessionCallback实现事务功能。文章来源地址https://www.toymoban.com/news/detail-756753.html

到了这里,关于io.lettuce.core.RedisCommandExecutionException: ERR EXEC without MULTI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 终极解决Flutter项目运行ios项目报错Without CocoaPods, plugins will not work on iOS or macOS.

    最近在开发Flutter项目,运行ios环境的时候报错没有CocoaPods,安卓环境可以正常运行,当时一脸懵逼,网上搜索了一下,有给我讲原理的,还有让我安装这插件那插件的,最终把电脑搞得卡死,还没有解决我的问题,其实很多人和我一样只想解决问题,而不是废话一大堆的文章

    2024年01月22日
    浏览(54)
  • could not resolve dependency: npm err! peer react@“^16.8.0 || ^17.0.0“ from @material-ui/core@4.12.4

    在执行 npm install 时看到以下错误: 系统使用了 Material UI (MUI) 和 ReactJS 18,很明显 MUI 的最新版本没有支持 ReactJS 18。 使用以下命令,让 NPM 支持更高的 ReactJS 版本 本文介绍了如何解决因为 Material UI 这样的 NPM 包不支持更高版本的依赖项 ReactJS 的解决方案。 https://stackoverf

    2024年02月11日
    浏览(87)
  • 【Java-IO流】cn.hutool.core.io.IORuntimeException: IOException: Stream closed

    今天在项目中需要读取request请求中的body多次,当我直接去read的时候出现了问题; 报错如下: 产生的原因如下: httpServletRequest中的流只能读取一次的原因 想要多次读取request中body的内容,需要先存储一份,然后读取; 问了导师,有一个类可以多次读取body内容,因为他会将

    2024年02月11日
    浏览(53)
  • 【lettuce-排行榜】

    背景: 这次游戏中台采用lettuce的zset完成游戏内的本服和跨服排行榜,因此写一下案例。 pom.xml RedisManager.java RankManager.java RankItem.java RankInfo.java Main.java redis中查看下

    2024年01月21日
    浏览(52)
  • SpringBoot集成Redis使用Lettuce

            Redis是最常用的KV数据库,Spring 通过模板方式(RedisTemplate)提供了对Redis的数据查询和操作功能。本文主要介绍基于RedisTemplate + lettuce方式对Redis进行查询和操作的案例。 一、Redis基础数据类型         首先对redis来说,所有的key(键)都是字符串。我们在谈基

    2024年02月05日
    浏览(53)
  • 验证Lettuce在单连接上进行多路复用

    redis multiplexing机制类似http2,在存在并发请求时能减少大量通讯延迟,但不支持blocking相关的操作(如BLPOP) RedisTemplate自动根据操作类型,选择是在单连接上进行多路复用(setex/get),还是申请新的连接/等待空闲连接(blpop) 实现blocking LPOP操作的方法在opsForList()里; 并发100压测期间

    2024年01月16日
    浏览(30)
  • 【Spring Boot 3】【Redis】集成Lettuce

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月18日
    浏览(42)
  • SpringBoot集成Lettuce连接Redis方法和案例

    说明: SpringBoot从2.0起默认使用lettuce客户端进行连接。 此次使用的版本:springboot:2.6.6,lettuce:6.1.8。 Springboot+Lettuce 单连方式 连接Redis单机/主备/Proxy集群示例。 1、在application.properties配置文件中加上redis相关配置。  2、Redis配置类RedisConfiguration。 3、Redis操作类RedisUtil。 4、

    2024年02月08日
    浏览(41)
  • SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式

    在Spring Boot 中配置Redis哨兵模式,可以使用 Lettuce 或 Jedis 配置 Redis 哨兵模式,实现高可用的 Redis 集群。 因为在Spring Boot中 spring-boot-starter-data-redis 已经实现了两种客户端链接方式,我们选择其中一种就可以。 Lettuce 和 Jedis 都是 Redis 客户端库,可以与 Redis 服务器进行通信。它

    2024年02月16日
    浏览(40)
  • Spring Data Redis切换底层Jedis 和 Lettuce实现

    Spring Data Redis是 Spring Data 系列的一部分,它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象,还支持Jedis和Lettuce两种连接方式。 可通过简单的配置就能连接Redis,并且可以切换Jedis和Lettuce两个连接方式。下面先来看看我们该如何使用它。 使

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包