一、什么是原子性?
原子性这个概念在数据库中和在并发编程中是两种不同的概念:
- 数据库中的原子性:要么都执行,要么都不执行
- 并发编程中的原子性:操作不可拆分、不被中断
Lua脚本是属于并发编程中的原子性,可以保证原子性,但是不能保证要么都执行,要么都不执行。
二、为什么Lua脚本可以保证原子性?
Lua脚本其实就是将多个命令打包成一个命令执行,但Lua脚本执行时不会被其他命令影响,原因是这期间会将其他客户端请求的命令先缓存起来,等Lua脚本执行完,才会把暂存的命令恢复执行。
三、Q&A
1、Lua脚本是能完全保证原子性吗?
严格来说,Lua脚本不能完全保证原子性,这里的原子性指的是数据库中的原子性。
因为Lua脚本和Redis事务一样,都是不支持回滚的,所以如果Lua脚本执行期间发生错误,那么已经执行的逻辑是不会回滚的。
2、Lua脚本可以用到什么场景?
- 分布式锁:相比
setnx
方式,Lua脚本可以保证正确解锁,具体可参考文章《如何实现一个分布式锁?》 - 限流
- …