Redis事务
开启事务 multi命令
multi 命令不能嵌套使用,如果已经开启了事务的情况下,再执行 multi 命令,会报错:ERR MULTI calls can not be nested
执行相关命令入列
即使事务队列中某个命令在执行期间发生了错误,事务也会继续执行,直到事务队列中所有命令执行完成。也就是中途某个命令错误并不会导致数据全部恢复事务开启前,只是错误的那个命令没执行。
但如果是入列命令错误,比如没有设置命令语法错误,没有添加value,事务就不执行。
重复执行 multi 会导致入列错误,但不会终止事务,最终查询的结果是事务执行成功了。除了重复执行 multi 命令,还有在事务状态下执行 watch 也是同样的效果。 不支持事务回滚,指的是不支持运行时错误的事务回滚。执行事务 exec/放弃事务 discard
监控 watch命令
watch 命令用于客户端并发情况下,为事务提供一个乐观锁(CAS,Check And Set),也就是可以用 watch 命令来监控一个或多个变量,如果在事务的过程中,某个监控项被修改了,那么整个事务就会终止执行,即exec 执行的结果为 nil,事务也不会执行。
watch 命令只能在客户端开启事务之前执行,在事务中执行 watch 命令会引发错误,但不会造成整个事务失败。
unwatch 命令用于清除所有之前监控的所有对象(键值对)。
watch 命令监控时,即使把原对象的值重新赋值给了原对象,这个时候 watch 命令也会认为监控对象还是被修改了。
事务错误&回滚
事务执行中的错误分为以下三类:
- 执行时才会出现的错误(简称:执行时错误);
- 入列时错误,不会终止整个事务;
- 入列时错误,会终止整个事务