一次redis事务引发的问题

147 阅读1分钟

背景

使用redis生成订单流水号,出现插入数据库时报错不能插入重复的订单号的情况

解决过程

  1. 第一反应是生成订单号的代码相关逻辑的并发情况没有处理好

查阅代码发现逻辑并没有问题,进行测试也没有发现问题

  1. 找到报错的方法,发现不是偶发现象

查阅代码发现在该方法里面有多次调用生成订单号的方法,测试发现只要在同一个方法中多次调用生成订单号的方法就会出现订单号生成重复的情况

  1. 找到问题原因,项目里开启了redis事务

回顾订单号生成的流程
从redis取出流水号 -> 进行自增 -> 插入数据库

因为有位老铁在项目中开启了redis事务,所以在报错方法中第一次调用生成订单号的方法时,流水号并没有真正的进行自增,导致第二次读到了还是没有自增过的流水号,所以出现了重复的订单号

redis事务

简单来说就是会讲所有命令存在队列中,等到事务提交之后,才会按顺序将命令真正执行