redis事务
1.redis事务的本质是一组命令的集合,一个事务中的所有命令会被序列化,在事务执行过程中,会按顺序执行
2.redis事务没有隔离级别,所有命令只是保存在队列中,并没有被执行
3.单条命令保证原子性,但是事务是不保证原子性的,(编译时错误是有原子性的,运行时错误是没有原子性的,报错时下面的命令还是会被执行)
正常情况下
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 1
QUEUED
127.0.0.1:6379> set b 2
QUEUED
127.0.0.1:6379> set c 3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
编译时异常
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 a
QUEUED
127.0.0.1:6379> set k2 b
QUEUED
127.0.0.1:6379> setget k3
(error) ERR unknown command `setget`, with args beginning with: `k3`,
127.0.0.1:6379> set k4 d
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k4
(nil)
结论:编译时事务是有原子性的
运行时异常
127.0.0.1:6379> set k1 "a"
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k2 "b"
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
2) OK
127.0.0.1:6379> get k2
"b"
结论:运行时事务不具有原子性