1. Redis 事务
原子性:要么也同时成功,要么同时失败
Redis事务的本质:一组命令的集合。一个事务的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。
一次性、顺序性、排他性。
------ 队列 set set set 执行 ------
Redis事务没有隔离级别的概念。
所有的命令在事务中,并没有直接执行。只有发起执行命令的时候才会执行。Exec
Redis单挑命令是保持原子性,但事务不保证原子性。
2. Redis 事务使用
- 开启事务(multi)
- 命令入队(......)
- 执行事务(exec)
2.1 创建事务
# 1. 开启事务(multi) 127.0.0.1:6379> multi OK # 2. 命令入队() 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> set k3 v3 QUEUED # 3. 执行事务(exec) 127.0.0.1:6379> exec 1) OK 2) OK 3) "v2" 4) OK
2.2 放弃事务
# 1. 开启事务 127.0.0.1:6379> multi OK # 2. 一些命令 127.0.0.1:6379> set k4 v4 QUEUED # 3. 取消事务 127.0.0.1:6379> discard OK 127.0.0.1:6379> get k4 (nil
2.3 命令异常
2.3.1 所有的命令都不会执行
编译型异常(代码有问题,命令有错误),事务中所有命令都不会执行!
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> set k4 v4 QUEUED 127.0.0.1:6379> set k5 v5 QUEUED 127.0.0.1:6379> exec # 执行时务报错 (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get k5 # 所有的命令都不会执行 (nil)
2.3.1 单条命令不会执行
运行异常(1/0),如果事务队列中存在语法性错误,那么执行命令的时候,其他命令可以正常执行。
127.0.0.1:6379> set k1 "v1" OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> incr k1 # 在执行的时候会失败 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> get k2 QUEUED 127.0.0.1:6379> exec 1) (error) ERR value is not an integer or out of range # 虽然第一一条命令报错,但依旧会正常执行成功 2) OK 3) OK 4) "v2"