是什么
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行执行而不会被其他命令插入,不许加塞。
常用命令
- MULTI
- EXEC
- DISCARD
- WATCH
五个case
-
正常执行
使用MULTI命令输入Redis事务。该命令始终以答复OK。此时,用户可以发出多个命令。Redis不会执行这些命令,而是将命令放入队列中。一旦调用EXEC,将执行所有命令。
> MULTI OK > INCR foo QUEUED > INCR bar QUEUED > EXEC 1) (integer) 1 2) (integer) 1
-
放弃事务
可以使用DISCARD来中止事务。在这种情况下,不执行任何命令,连接状态恢复为正常。
> SET foo 1 OK > MULTI OK > INCR foo QUEUED > DISCARD OK > GET foo "1"
-
全体连坐
命令无法进入加入到队列,执行exec命令后会终止所有命令
-
冤头债主
命令正常加入队列中,在exec命令执行后发生错误,会正常执行其他正确命令
-
watch监控
WATCH用于为Redis事务提供Check And Set(CAS)行为,防止加塞修改。
监控被watch的键,在exec命令之前任何一次修改了被监视的键,则整个事务中止。exec命令返回null
一旦执行exec命令,之前所加的监控锁都会被取消小总结:watch指令,类似于乐观锁,事务提交时如果Key的值已经被改变,整个事务便都不会执行。通过watch命令监控了多个Key其中任意有一个Key的值被修改,exec命令执行的事务都将被放弃。
三阶段
- 开启 通过MULTI开始一个事务
- 入队 将多个命令加入队列中
- 执行 通过EXEC命令触发事务
三特性
-
单独隔离操作
事务中的命令会序列化、按顺序地执行。事务执行过程不会被其他客户端命令打断
-
没有隔离级别概念
队列中的命令在exec事务触发之前不会被实际执行
-
不保证原子性
当命令成功被加入到队列之后,在exec命令触发事务之后发生执行失败,其他命令还是会正常执行,不会回滚。