官方介绍
简而言之就是可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其它命令插入,不允许加塞;
Redis事务的作用
一个队列中,一次性,顺序性、排他性的执行一系列命令;
常用命令
multi
标记一个事务的开始,执行完此命令后,后续的操作,都会放入到队列中统一执行:
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
exec
执行所有事务块内的命令:
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> exec
1) OK
2) OK
3) "v1"
discard
取消事务,放弃执行事务块内的命令:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get k1
"v1"
watch
监控一个或者多个key,如果在事务提交之前,这些被监控的key被其它命令所改动,那么事务将会被打断,
例如我们监控一个key为balance
的数据,然后开启事务,再设置值:
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set balance 100
QUEUED
此时我们在开一个窗口,设置balance
的值:
127.0.0.1:6379> get balance
"120"
127.0.0.1:6379> get balance
"120"
127.0.0.1:6379> set balance 99
OK
然后再回到第一个窗口,提交事务,发现执行失败,也就是watch指令监控的key,如果在提交事务时发现被其它客户端修改了,那么整个队列的指令都不会执行:
127.0.0.1:6379> exec
(nil)
此时我们获取balance
的值,可以看到没有改变:
127.0.0.1:6379> get balance
"99"
unwatch
取消对所有key的监控,注意此命令是解除所有被监控的key,无法指定单独某一个key:
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> unwatch
OK
特性介绍
- 没有隔离级别的概念,队列中的命令没有提交之前都不会实际的执行,因为事务提交之前任何指令都不会被实际执行,也就不存在事务内的查询要看到事务内的更新,在事务外查询不能看到的问题;
- 不保证原子性,Redis同一个事务中如果有一条命令执行失败,其余的命令仍然会被执行,不会有回滚