lua脚本为什么支持原子性
Redis事务满足原子性吗
有两种错误:语法错误和运行错误
语法错误可以保障原子性,但是运行错误无法保障原子性,正常语句还是能够正常执行
为什么redis不支持回滚
官方给出了解释
- redis命令失败只会发生在语法错误或数据类型错误的情况,这一结果都是由编程过程中的错误导致,这种情况应该在开发环境中检测出来,而不是生产环境。
- 不使用回滚,能使redis内部设计更简单,速度更快
- 回滚不能避免编程逻辑中的错误,如果想要将一个键的值增加2却只增加了1,这种情况即使提供回滚也无法提供帮助。
基于以上原因,redis官方选择了更简单、更快的方法,不支持错误回滚。这样的话,如果在我们的业务场景中需要保证原子性,那么就要求了开发者通过其他手段保证命令全部执行成功或失败,例如在执行命令前进行参数类型的校验,或在事务执行出现错误时及时做事务补偿。
Lua脚本满足原子性吗
结论:运行错误的话只会执行错误之前的语句,还是不支持原子性
Lua脚本满足原子性的原因:
在redis中是使用的同一个lua解释器来执行所有命令,也就保证了当一段lua脚本在执行时,不会有其他脚本或redis命令同时执行,保证了操作不会被其他指令插入或打扰,实现的仅仅是这种程度上的原子操作。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!