介绍
Redis的事务本质就是一组命令的集合,可以一次性支持执行多个指令。串行执行,从上到下依次执行。
Redis 事物特点
- Redis事务没有隔离性的概念。
所有的命令在事务真正执行之前不进行任何操作,只是在队列缓存中,可执行可撤销- Redis不保证原子性
Redis的单条命令一定是原子性的,但是事务中,如果其中一个命令执行失败,其与的命令依旧执行。
语法格式
# 开启一个事务
# 一堆指令
# 执行这个事务
multi # 标记事务的开始
... # 指令集
exec # 执行事务
discard # 放弃事务,取消这个事务
验证
- 成功执行
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 k1
QUEUED
127.0.0.1:6379> keys *
QUEUED
127.0.0.1:6379> EXEC
OK
OK
v1
k2
k1
127.0.0.1:6379>
- 事物取消
127.0.0.1:6379> MULTI # 开启事物
OK
127.0.0.1:6379> set a1 b1
QUEUED
127.0.0.1:6379> set a2 b2
QUEUED
127.0.0.1:6379> get a2
QUEUED
127.0.0.1:6379> keys *
QUEUED
127.0.0.1:6379> DISCARD # 取消事物
OK
127.0.0.1:6379> get a2
127.0.0.1:6379> keys *
127.0.0.1:6379>
编译型错误(不会执行)
127.0.0.1:6379>
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> getset k8 # k8 不存在,获取报错,类似java 编译错误
ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> EXEC
EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
出现错误,执行失败
运行时错误
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR k1 # k1 是字符串类型,无法进行加运算
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> keys *
QUEUED
127.0.0.1:6379> EXEC
ERR value is not an integer or out of range
OK
v2
k2
k1
127.0.0.1:6379>
虽然有语法错误,仍会继续执行
总结
- reids 事物是一组命令的集和,从上向下依次执行
- 开启事物最终执行(exec)前,先入队列,不真正去执行
- 事物执行前可撤销
- 事物不保证原子性
- 只有出现语法错误事物执行失败
- 部分非语法性错误,部分失败,不影响整体执行
- redis 没有回滚机制