redis的事务控制

2019-05-26  本文已影响0人  鸿雁长飞鱼龙潜跃

redis的事务控制。

问个最简单的问题:redis有事务吗?

答:有。

再问个问题:redis事务能保证操作的原子性吗?

答:不能。

为什么不能保证原子性呢?

……

要搞清楚这个问题,需要先看redis事务命令。

multi:开始事务。

exec:执行事务(为什么不是提交事务啊)。执行过程中如果报错,不会回滚,后面的逻辑还会执行。

discard:丢弃事务(为什么不是回滚事务啊)。丢弃事务指的是,丢弃事务缓存队列中的所有指令。

看到了吧,是因为exec执行的过程中如果有异常,后面的操作还会继续执行。也就是说redis不会回滚。

redis为什么要这样设计呢?

redis为什么不支持回滚呢?

我们看看网友的观点,下面这段内容就是网上的观点,基本上代表了大部分人的观点。

Redis命令在事务中可能会执行失败,但是Redis事务不会回滚,而是继续会执行余下的命令。如果您有一个关系型数据库的知识,这对您来说可能会感到奇怪,因为关系型数据在这种情况下都是会回滚的。

Redis这样做,主要是因为:

第一点:执行就是要成功,之所以失败,那是程序性问题。只有当发生语法错误(这个问题在命令队列时无法检测到)了,Redis命令才会执行失败, 或对keys赋予了一个类型错误的数据:这意味着这些都是程序性错误,这类错误在开发的过程中就能够发现并解决掉,几乎不会出现在生产环境。

第二点:为了提高速度。由于不需要回滚,这使得Redis内部更加简单,而且运行速度更快。

对于第一点我有一个疑问:为什么都是程序性问题,也有可能是网络问题啊?难道也不考虑网络问题吗?还是说redis的命令不存在网络问题?

上一篇下一篇

猜你喜欢

热点阅读