刚才在学习NoSql的五种数据类型的时候,看到key-value类型不适合需要事务的数据库操作,因为key-value不支持事务的回滚。我就出现疑问了,这篇文章是对问题的解决和扩展。
参考:https://blog.youkuaiyun.com/Thinking_Mind/article/details/79657671
问题
Redis是如今高并发项目中特别受欢迎的一个Key-value类型数据库,回滚是事务一个特别重要的特性,那么Redis为什么不支持事务的回滚?
原因
在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作。
也就是说,只有当被调用的Redis命令有语法错误时,这条命令才会执行失败(在将这个命令放入事务队列期间,Redis能够发现此类问题),或者对某个键执行不符合其数据类型的操作。
扩展
实际上,这就意味着只有程序错误才会导致Redis命令执行失败,这种错误很有可能在程序开发期间发现,一般很少在生产环境发现。 Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因此Redis不需要事务回滚的能力。
对于Redis事务的这种行为,有一个普遍的反对观点,那就是程序有可能会有缺陷(bug)。但是,事务回滚并不能解决任何程序错误。例如,如果某个查询会将一个键的值递增2,而不是1,或者递增错误的键,那么事务回滚机制是没有办法解决这些程序问题的。
本文讨论了Redis作为一种流行的Key-value数据库,在事务处理上不支持回滚的原因。解释了Redis为何选择这种设计,即使在命令执行失败时仍继续执行后续命令,并探讨了这种做法背后的逻辑。
245

被折叠的 条评论
为什么被折叠?



