MULTI 、 EXEC 与 WATCH
当输入MULTI
时,标志着事务的开始,之后命令入队,当输入EXEC
时,表示开始执行事务。
WATCH
命令是一个乐观锁(optimistic locking),它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复。
WATCH功能的实现原理:每个Redis数据库都保存着一个watched_keys字典,这个字典的键是某个被WATCH命令监视的数据库键,而字典的值则是一个链表,链表中记录了所有监视相应数据库键的客户端。所有对数据库修改的命令,在执行完这些命令之后,Redis就会从字典中查看刚刚修改的键是否被其他客户端监视,如果是的话,那么就将该客户端的CAS标识打开,表明该客户端的事务安全性被破坏。因此当服务器收到了一个客户端发来的EXEC命令时,它会先判断该客户端的CAS标识是否被打开,如果被打开,那就拒绝执行,反之可以正常执行。
原子性
有三种情况:
1.正常情况下,MULTI开启事务之后,输入的命令正常入队,EXEC提交之后,所有命令正常执行。
2.事务因为某条命令入队出错而被拒绝执行。比如我们只输入了一个GET
那么服务器就会拒绝执行本次事务。
3.所有命令成功入队,但是在执