可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。
在一个队列中,一次性、顺序性、排他性地执行一系列命令。
单独的隔离操作 | Redis的事务仅仅是保证事务里的操作会被连续独占的执行,Redis命令执行时单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的。 |
没有隔离级别的概念 | 因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了 |
不保证原子性 | Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力。 |
排他性 | Redis会保证一个事务内的命令依次执行,而不会被其他命令插入。 |
开始事务:multi开始一个事务
入队命令:将多个命令放入队到事务中,接到这些命令并不会马上执行,而是放到等待执行的事务队列中
执行事务:exec命令触发事务
watch key1 key2 … : 监视一个或多个key,如果在事务执行之前,被监视的key被其他命令改动,则事务被打断 (乐观锁 )
multi:标记一个事务块的开始
exec:执行所有事务块的命令 ( 一旦执行exec后,之前加的监控锁都会被取消掉 )
discard : 取消事务,放弃事务块中的所有命令
unwatch :取消watch对所有key的监控
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> INCR count
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
3) OK
4) (integer) 2
127.0.0.1:6379> get k3
"v3"
一旦执行力exec,之前加的监控锁都会被取消。
当客户端连接丢失的时候(例如:退出连接),所有的东西都会被取消监视。