1. 事务介绍
Redis事务可以一次执行多个命令,本质是一组命令的集合,这些命令按顺序地串行化执行而不会被其他命令插入
其具有以下特点:
- Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的
- 没有隔离级别概念。因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了
- 不保证原子性。Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
- 排他性。Redis会保证一个事务内的命令依次执行,而不会被其它命令插入
2. 常用命令
discard
:取消事务,放弃执行事务块内的所有命令exec
:执行所有事务块内的命令multi
:标记一个事务块的开始unwatch
:取消watch命令对于所有key的监视watch key[key...]
:监视一个或多个key,如果在事务执行之前,这个(些)key被其他命令所改动,那么事务就会执行失败
举例:
watch k2
MULTI
set k1 v1
set k2 v2
set k3 v3
exec
可以看到,在multi
与exec
中的就是事务块的所有命令,这三条命令将被顺序连续执行,不会被别的命令插入执行。如果事务执行时,也就是exec
时,如果发现k2
被修改,那么该事务就会执行失败。
3. 特殊情况
3.1 如果在事务执行之前就出现错误(大多是语法错误),那么事务执行时,所有命令都不会被执行。
例如:
MULTI
set k1 v1
set k2
set k3 v3
exec
可以看到,存在语法错误,set k2
语句中缺少了value
,在这种情况下,第一条语句set k1 v1
也是无效的,执行失败的。
3.2 如果语法没有错误,执行时出现了错误,那么,只有出现错误的语句执行失败,其他语句正常执行。
例如:
MULTI
set k1 v1
incr k2
set k3 v3
exec
在上述例子中,由于k2
的值是string
类型,不能使用incr
命令,因此在事务执行时会出现错误。但在这种情况下,并不会影响其他语句的正常执行。