素手烹茶|Redis 事务也叫事务吗?,不支持原子性的( 二 )
对于那些在EXEC命令执行之后所产生的错误 , 并没有对它们进行特别处理:即使事务中有某个/某些命令在执行时产生了错误 , 事务中的其他命令仍然会继续执行 。
全体连坐(某一条操作记录报错的话 , exec后所有操作都不会成功)
Redis命令只会因为错误的语法而失败(并且这些问题不能在入队时发现) , 或是命令用在了错误类型的键上面:这也就是说 , 从实用性的角度来说 , 失败的命令是由编程错误造成的 , 而这些错误应该在开发的过程中被发现 , 而不应该出现在生产环境中 。 因为不需要对回滚进行支持 , 所以Redis的内部可以保持简单且快速 。
有种观点认为Redis处理事务的做法会产生bug , 然而需要注意的是 , 在通常情况下 , 回滚并不能解决编程错误带来的问题 。 举个例子 , 如果你本来想通过INCR命令将键的值加上1 , 却不小心加上了2 , 又或者对错误类型的键执行了INCR , 回滚是没有办法处理这些情况的 。
鉴于没有任何机制能避免程序员自己造成的错误 , 并且这类错误通常不会在生产环境中出现 , 所以Redis选择了更简单、更快速的无回滚方式来处理事务 。
用户还可以在单个WATCH命令中监视任意多个键 , 就像这样:
redis>WATCHkey1key2key3OK当EXEC被调用时 , 不管事务是否成功执行 , 对所有键的监视都会被取消 。 另外 , 当客户端断开连接时 , 该客户端对键的监视也会被取消 。
我们看个简单的例子 , 用watch监控我的账号余额(一周100零花钱的我) , 正常消费
推荐阅读