事务


事务概念


redis中的事务是一组命令的集合。

一个事务中的命令要么都运行,要么都不运行。

redis> MULTI
OK
redis> CMD1
QUEUED
redis> CMD2
QUEUED
...
redis> EXEC
1) (integer) 1
2) (integer) 1

假设在发送EXEC之前,client断线了,那么redis会清空事务队列。事务中的全部命令都不会运行。

而一旦client发送了EXEC命令,全部的命令都会被运行。即使此后client断线也没关系,由于redis中已经记录了全部要运行的命令。

除此之外。Redis的事务是一个原子操作, 能够保证一个事务内的命令依次运行而不被其它命令插入

错误处理


  • 语法错误。

    语法错误指命令不存在或者命令參数的个数不正确

    redis>MULTI
    OK
    redis>SET key value
    QUEUED
    redis>SET key
    (error)ERR wrong number of arguments for 'set' command
    redis> ERRORCOMMAND key
    (error) ERR unknown command 'ERRORCOMMAND'
    redis> EXEC
    (error) EXECABORT Transaction discarded because of previous errors.

    仅仅要有一个命令有语法错误,运行EXEC命令后Redis就会直接返回错误,连语法正确的命令也不会运行

    注意:Redis 2.6.5之前的版本号会忽略有语法错误的命令。然后运行事务中其它语法正确的命令。就此例而言。SET key value会被运行,EXEC命令会返回一个结果:1) OK。

  • 运行错误。运行错误指在命令运行时出现的错误。比方使用散列类型的命令操作集合类型的键,这种错误在实际运行之前Redis是无法发现的,所以在事务里这种命令是会被Redis接受并运行的。假设事务里的一条命令出现了运行错误,事务里其它的命令依旧会继续运行(包含出错命令之后的命令)

    redis>MULTI
    OK
    redis>SET key 1
    QUEUED
    redis>SADD key 2
    QUEUED
    redis>SET key 3
    QUEUED
    redis>EXEC
    1) OK
    2) (error) ERR Operation against a key holding the wrong kind of value
    3) OK
    redis>GET key
    "3"

    redis的事务没有关系数据库提供的回滚功能。

watch命令


WATCH命令能够监控一个或多个键。一旦当中有一个键被改动(或删除),之后的事务就不会运行。

监控一直持续到EXEC命令(事务中的命令是在EXEC之后才运行的,所以在MULTI命令后能够改动WATCH监控的键值)

redis>SET key 1
OK
redis>WATCH key
OK
redis>SET key 2
OK
redis>MULTI
OK
redis>SET key 3
QUEUED
redis>EXEC
(nil)
redis>GET key
"2"

上例中在运行WATCH命令后、事务运行前改动了key的值(即SET key 2)。所以最后事务中的命令SET key 3没有运行,EXEC命令返回空结果。

因为WATCH命令的作用仅仅是当被监控的键值被改动后阻止之后一个事务的运行,而不能保证其它client不改动这一键值。所以我们须要在EXEC运行失败后又一次运行整个函数

运行EXEC命令后会取消对全部键的监控,假设不想运行事务中的命令也能够使用UNWATCH命令来取消监控

注意:

假设使用WATCH命令监測了一个拥有生存时间的键,该键时间到期自己主动删除并不会被WATCH命令觉得该键被改变。


假设发现错误,请轻拍,欢迎留言交流。谢谢

posted on 2017-08-09 18:36  lxjshuju  阅读(161)  评论(0编辑  收藏  举报