为什么Lua脚本可以保证原子性 ?

一、原子性在并发编程中,和在数据库中两种不同的概念


在数据库中,事务的 ACID中原子性指的是 "要么都执行要么都回滚"


在并发编程中,原子性指的是 "操作不可拆分、不被中断"


Redis既是一个数据库,又是一个支持并发编程的系统,所以,他的原子性有两种。所以,我们需要明确清楚,在问 "Lua脚本保证Redis原子性" 的时候,指的到底是哪个原子性


Lua脚本可以保证原子性,因为Redis会将Lua脚本封装成一个单独的事务,而这个单独的事务会在Redis客户端运行时,由Redis服务器自行处理并完成整个事务,

如果在这个进程中有其他客户端请求的时候,Redis将会把它暂存起来,等到 Lua 脚本处理完毕后,才会再把被暂存的请求恢复。


这样就可以保证整个脚本是作为一个整体执行的,中间不会被其他命令插入。但是,如果命令执行过程中命令产生错误,事务是不会回滚的,将会影响后续命令的执行。


也就是说,Redis保证以原子方式执行Lua脚本,但是不保证脚本中所有操作要么都执行或者都回滚。


那就意味着,Redis中Lua脚本的执行,可以保证并发编程中不可拆分、不被中断的这个原子性,但是没有保证数据库ACID中要么都执行要么都回滚的这个原子性。

posted @ 2025-06-19 18:27  jock_javaEE  阅读(199)  评论(0)    收藏  举报