redis的事务控制
2019-05-26 本文已影响0人
鸿雁长飞鱼龙潜跃
redis的事务控制。
问个最简单的问题:redis有事务吗?
答:有。
再问个问题:redis事务能保证操作的原子性吗?
答:不能。
为什么不能保证原子性呢?
……
要搞清楚这个问题,需要先看redis事务命令。
multi:开始事务。
exec:执行事务(为什么不是提交事务啊)。执行过程中如果报错,不会回滚,后面的逻辑还会执行。
discard:丢弃事务(为什么不是回滚事务啊)。丢弃事务指的是,丢弃事务缓存队列中的所有指令。
看到了吧,是因为exec执行的过程中如果有异常,后面的操作还会继续执行。也就是说redis不会回滚。
redis为什么要这样设计呢?
redis为什么不支持回滚呢?
我们看看网友的观点,下面这段内容就是网上的观点,基本上代表了大部分人的观点。
Redis命令在事务中可能会执行失败,但是Redis事务不会回滚,而是继续会执行余下的命令。如果您有一个关系型数据库的知识,这对您来说可能会感到奇怪,因为关系型数据在这种情况下都是会回滚的。
Redis这样做,主要是因为:
第一点:执行就是要成功,之所以失败,那是程序性问题。只有当发生语法错误(这个问题在命令队列时无法检测到)了,Redis命令才会执行失败, 或对keys赋予了一个类型错误的数据:这意味着这些都是程序性错误,这类错误在开发的过程中就能够发现并解决掉,几乎不会出现在生产环境。
第二点:为了提高速度。由于不需要回滚,这使得Redis内部更加简单,而且运行速度更快。
对于第一点我有一个疑问:为什么都是程序性问题,也有可能是网络问题啊?难道也不考虑网络问题吗?还是说redis的命令不存在网络问题?