redis是NOSQL数据库,因此也存务,只是在事此事务和关系型数据库的事务是有区别的。数据库
在执行 MULTI 命令以后,此时将进入阻塞状态。当咱们继续发送命令时,命令不会当即执行,而是会排队等待。直到输入 EXEC 命令执行,队列中的命令才会一一执行编程
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set k1 111 QUEUED 127.0.0.1:6379> set k2 222 QUEUED 127.0.0.1:6379> set k3 333 QUEUED 127.0.0.1:6379> set k4 444 QUEUED 127.0.0.1:6379> get k3 QUEUED
127.0.0.1:6379> EXEC 1) OK 2) OK 3) OK 4) OK 5) "333"
通常都是命令出现错误。Redis 会将进入队列失败的事件进行记录,在执行 EXEC
命令提交事务的时候,不会执行而且会放弃这一条事务。测试
输入命令code
127.0.0.1:6379> multi OK 127.0.0.1:6379> set name zhang QUEUED 127.0.0.1:6379> set age 18 QUEUED 127.0.0.1:6379> set sex nan haha #故意写错 QUEUED 127.0.0.1:6379> set address beijing QUEUED
执行结果队列
127.0.0.1:6379> exec 1) OK 2) OK 3) (error) ERR syntax error 4) OK
查询数据事件
127.0.0.1:6379> keys * 1) "address" 2) "name" 3) "age" 127.0.0.1:6379> get name "zhang" 127.0.0.1:6379> get sex (nil)
Redis 命令只会由于错误的语法而失败(而且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来讲,失败的命令是由编程错误形成的,而这些错误应该在开发的过程当中被发现,而不该该出如今生产环境中。事务
由于不须要对回滚进行支持,因此 Redis 的内部能够保持简单且快速开发
watch 命令能够监控一个或多个键,一旦有其中一个键被修改(被删除),后面的事务就不会执行了。监控一直持续到 EXEC 命令(事务中的命令是在exec以后才执行的,因此在multi命令后能够修改watch监控的键值)get
假设咱们经过watch命令在事务执行以前监控了多个Keys,假若在watch以后有任何Key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。
这里能够看到保存到数据数据库的 name = zhang
被修改为了 name = li
127.0.0.1:6379> set name zhang OK 127.0.0.1:6379> WATCH name OK 127.0.0.1:6379> set name li OK 127.0.0.1:6379> get name "li"
使用 watch
监听 age
,在再执行 MULTI
命令,在执行 exec
以前 age
有任何改变,都不会执行此事务
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> WATCH age OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set age 21 QUEUED 127.0.0.1:6379> exec (nil) 127.0.0.1:6379> get age "18" 127.0.0.1:6379>
exec
执行以后,会自动执行 UNWatch
命令,撤销监听操做
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> WATCH age OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set age 21 QUEUED 127.0.0.1:6379> exec (nil) 127.0.0.1:6379> get age "18" 127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> get age "20"
此命令表示撤销监听
下面的操做测试能够看到,取消监听后,exec
提交事务后,address
被修改了
127.0.0.1:6379> set address beijing OK 127.0.0.1:6379> WATCH address OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> UNWATCH QUEUED 127.0.0.1:6379> set address nanchang QUEUED 127.0.0.1:6379> exec 1) OK 2) OK 127.0.0.1:6379> get address "nanchang"