美文网首页
Redis学习笔记:事务

Redis学习笔记:事务

作者: 马谦马谦马谦 | 来源:发表于2017-11-30 21:40 被阅读0次

    Redis学习笔记:事务

    原文链接:Redis学习笔记:事务

    一、事务的描述

    MySQL一样,Redis中也有事务这一个概念,redis中的事务也是可以用来执行一组命令的集合,同时也可以把事务当作一个命令。因为它的特性和命令无差,要么正确全部运行,要么错误都不运行。但是和MySQL的事务不同的是,redis中的事务不支持回滚操作。也就是说,一旦事务出错,它没有办法再回到程序出错前,只能由程序员自己想办法来处理剩下的烂摊子。

    二、使用事务

    redis中使用事务需要用到MULTIEXEC命令:在一个事务开始前输入MULTI,然后执行我们的命令,最后使用EXEC提交,只有执行EXEC后,事务才会被提交,命令才会生效,例如:

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k 1
    QUEUED
    127.0.0.1:6379> set v 2
    QUEUED
    127.0.0.1:6379> get k
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) OK
    3) "1"
    

    当我们使用MULTI命令后,接下来的所有命令都会被redis放到一个事务队列当中去,直到输入EXEC后redis才会把这些命令依次都提交,并根据顺序依次返回结果。

    三、错误处理

    事务对错误的处理分为以下两种情况:

    3.1 语法错误

    如果命令出现语法错误,例如命令输入错误或者参数个数错误,这种情况下redis会直接返回错误,并且事务中所有的语句都不会被执行:

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k 2
    QUEUED
    127.0.0.1:6379> abc k 1
    (error) ERR unknown command 'abc'
    127.0.0.1:6379> set k
    (error) ERR wrong number of arguments for 'set' command
    127.0.0.1:6379> exec
    (error) EXECABORT Transaction discarded because of previous errors.
    

    3.2 运行错误

    运行错误是指在redis运行时才能发现的错误,例如用散列的命令操作字符串等等,这种情况下redis会执行正确的命令并返回错误的命令:

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set key 1
    QUEUED
    127.0.0.1:6379> sadd key 2
    QUEUED
    127.0.0.1:6379> set key 3
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
    3) OK
    

    由于redis时没有提供类似Rollback的功能,所以出现这种错误的时候我们只能自己想办法来弥补这个错误。同时这也就要求程序员在进行redis操作时严谨一些,尽量避免此类错误。

    四、WATCH

    和关系型数据库不同的是,MySQLOracle在执行事务的时候会对事务操作的数据加锁,其他的的客户端在事务执行完毕之前都无法对数据进行更改。而redis执行事务时却不同,它并不能阻止其他客户端修改事务中要处理的数据,这个时候就需要用到WATCH命令。WATCH命令可以用来监控一个键,一旦它监控的键发生了更改,它之后的事务就不会被执行:

    127.0.0.1:6379> set key 1
    OK
    127.0.0.1:6379> watch key
    OK
    127.0.0.1:6379> set key 2
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set key 3
    QUEUED
    127.0.0.1:6379> exec
    (nil)
    127.0.0.1:6379> get key
    "2"
    

    这里由于在MUTLI之前运行更改了key的值为2,所以事务中的语句set key 3不会被执行。

    在执行WATCH后如果想取消监控可以使用UNWATCH命令,或者等到下次执行EXEC命令自动取消监控。

    相关文章

      网友评论

          本文标题:Redis学习笔记:事务

          本文链接:https://www.haomeiwen.com/subject/pvmbbxtx.html