redis06-事务

1.基本说明

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。

2.事务相关的几个命令

  MULTI:标记一个事务块的开始 

redis> MULTI            # 标记事务开始
OK

redis> INCR user_id     # 多条命令按顺序入队
QUEUED

redis> INCR user_id
QUEUED

redis> INCR user_id
QUEUED

redis> PING
QUEUED

redis> EXEC             # 执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

  ETEC:执行事务内的所有命令

    假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断

  DISCARD:取消事务,放弃执行事务块内的所有命令

    如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH

redis> MULTI
OK

redis> PING
QUEUED

redis> SET greeting "hello"
QUEUED

redis> DISCARD
OK

  WATCH:监视一个(或多个) key

    如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断(也就是隔离性)。事务执行完成,WATCH也结束了。

    Watch指令,类似乐观锁,事务提交时,如果Key的值已经被别的客户端改变,比如某个list已经被别的客户端push/pop过了,整个事务队列都不会被执行

redis> WATCH lock lock_times
OK

  UNCATCH:取消 WATCH 命令对所有 key 的监视   

    如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。

    因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了,WATCH也就结束了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH

3.关于MULTI事务的简要说明

  当我们开启一个事务的时候,输入一条条的指令。

  情况1:当某条命令格式没有问题,但是执行出错,比如incr k1,k1自增命令,如果k1不是数字,那么这条命令会报错。但是事务中这条命令之外的其他命令照样会执行(这条命令之前和之后的命令都会正常执行)。也就是说,在这种情况下,这些命令的执行并不是原子性执行的。

  情况2:当事务中某条命令格式就错误。那么事务中其他命令都不会执行。而在编码的角度来看的话,我们调用相关写方法,不会出现这个问题。

 

原文地址:https://www.cnblogs.com/jthr/p/14488071.html