标签:abort require 相对 会话 nil 就是 批量 syn 多个
mset k1 v1 k2 v2 k3 v3
multi
set k1 vv1
get k1
set k4 v4
get k4
exec
keys *
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> set k1 11 12
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR syntax error
127.0.0.1:6379> get k5
"v5"
127.0.0.1:6379> get k1
"vv1"
127.0.0.1:6379> keys *
1) "k5"
2) "k1"
3) "k2"
4) "k3"
5) "k4"
可以看出,multi后加入事务命令OK,但exec执行时出错时,并没有全部回滚。。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> getset k3
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> getset k3 v3
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
(empty list or set)
可以看出,exec之前出错,整个事务回滚,即DISCARD。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> keys *
(empty list or set)
discard比较好理解,就是主动退出/回滚事务,取消命令的执行。
127.0.0.1:6379> get k1
"vv1"
127.0.0.1:6379> watch k1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 0v1
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> watch k1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 vv1
QUEUED
127.0.0.1:6379> set k2 vv2
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> mget k1 k2
1) "vvvv1"
2) "v2"
127.0.0.1:6379> get k1
"vv1"
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k1 vvvv1
OK
127.0.0.1:6379> get k1
"vvvv1"
可以看到结果是全部回滚。
由上面使用可以看出redis事务并不像传统数据库事务那么“纯粹”——出错便全体回滚。
大部分场景都是“部分事务回滚”,表现有点类似spring配置事务传播行为的 RequiredNew。
redis事务操作出错是否全部回滚,本身也“看情况”
官方关于为什么不支持传统回滚的原因(说白了就是redis很快,不需要)
https://redis.io/topics/transactions#why-redis-does-not-support-roll-backs
Why Redis does not support roll backs?
当然,使用 watch-multi-cas-exec 不一样,这会DISCARD,代表全部回滚。
综上,结合与传统数据库事务特点的对比,redis“部分支持事务”:
标签:abort require 相对 会话 nil 就是 批量 syn 多个
原文地址:https://www.cnblogs.com/noodlerkun/p/11503655.html