redis 事务问题
【redis】redis是否支持原子性?
什么是redis事务?
redis事务是用来一次性地执行多条命令。使用MULTI开启一个事务,然后将多个命令入队到事务的队列中,最后由EXEC命令触发事务,执行事务中的所有命令。
【例子】
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name HaHa
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (integer) 19
【语法错误】
命令入事务队列语法错误!
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name Hydra
QUEUED
127.0.0.1:6379> incr
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
结果!
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get age
(nil)
结论①:只要事务中的一条命令有语法错误,在执行exec后就会直接返回错误,包括语法正确的命令在内的所有命令都不会被执行。
【运行错误】
执行的指令有错,入队前无法被发现。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name Hydra
QUEUED
127.0.0.1:6379> set age eighteen
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> del name
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) (integer) 1
结果!
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get age
"eighteen"
结论②:存在运行错误的情况下,除执行中出现错误的命令外,其他命令都能正常执行。
【总结】
- 存在语法错误的情况下,所有命令都不会执行;
- 存在运行错误的情况下,除执行任务队列中出现错误的命令失败外,其他命令都能正常执行;
- 通过分析我们知道了redis中的事务是不满足原子性的,在运行错误的情况下,并没有提供类似数据库中的回滚功能。
结语,如果考虑redis事务原子性可以加入Lua脚本。