为什么说redis的事务不支持回滚?

redis在事务中可以执行DISCARD 执行后 MULTI到DISCARD之间的命令无效,这就和rollback实现的效果没区别了
那为什么说不支持回滚呢

redis 事务通过 multi 开启,本质是给服务端发送一条指令说明这是事务请求,后续服务端接收的指令就放在队列中,直到 exec 指令提交,才开始真正的执行所有指令。

当你提交 discard 相当于废弃当前事务,服务端接收后直接清空当前所有信息(状态、队列中的指令 ...),相当于事务没有提交就放弃了,没有提交哪有回滚一说?

当你 discard 提交后再看看服务端返回:

127.0.0.1:6379> multi 
OK
127.0.0.1:6379> set key 1
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI

告诉你当前已经没有事务了。

更多详细介绍可以看看这篇文章:

redis对事务只是“简单的支持”,可以在执行命令之前,用MULTI命令申明要开启一个事务,然后将多个命令放入事务队列,最后输入EXEC执行事务队列中的多个命令。在redis 2.6.5之前,如果事务队列中间某个命令有语法错误,它之前、之后的命令依旧会执行。在redis 2.6.5以后,如果事务队列中有一个命令出现语法错误,整个事务也会失败。redis不支持事务回滚,主要是事务回滚的功能跟redis追求简单高效的服务设计相悖,而且redis的作者认为,redis事务执行失败,主要发生在开发阶段,在实际生产环境很少发生,所以redis没有必要支持事务回滚。