Redis-事务

是什么

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

常用命令

  • MULTI
  • EXEC
  • DISCARD
  • WATCH

五个case

  1. 正常执行

    使用MULTI命令输入Redis事务。该命令始终以答复OK。此时,用户可以发出多个命令。Redis不会执行这些命令,而是将命令放入队列中。一旦调用EXEC,将执行所有命令。

    > MULTI
    OK
    > INCR foo
    QUEUED
    > INCR bar
    QUEUED
    > EXEC
    1) (integer) 1
    2) (integer) 1
    
  2. 放弃事务

    可以使用DISCARD来中止事务。在这种情况下,不执行任何命令,连接状态恢复为正常。

    > SET foo 1
    OK
    > MULTI
    OK
    > INCR foo
    QUEUED
    > DISCARD
    OK
    > GET foo
    "1"
    
  3. 全体连坐

    命令无法进入加入到队列,执行exec命令后会终止所有命令

  4. 冤头债主

    命令正常加入队列中,在exec命令执行后发生错误,会正常执行其他正确命令

  5. watch监控

    WATCH用于为Redis事务提供Check And Set(CAS)行为,防止加塞修改。
    监控被watch的键,在exec命令之前任何一次修改了被监视的键,则整个事务中止。exec命令返回null
    一旦执行exec命令,之前所加的监控锁都会被取消

    小总结:watch指令,类似于乐观锁,事务提交时如果Key的值已经被改变,整个事务便都不会执行。通过watch命令监控了多个Key其中任意有一个Key的值被修改,exec命令执行的事务都将被放弃。

三阶段

  • 开启 通过MULTI开始一个事务
  • 入队 将多个命令加入队列中
  • 执行 通过EXEC命令触发事务

三特性

  • 单独隔离操作

    事务中的命令会序列化、按顺序地执行。事务执行过程不会被其他客户端命令打断

  • 没有隔离级别概念

    队列中的命令在exec事务触发之前不会被实际执行

  • 不保证原子性

    当命令成功被加入到队列之后,在exec命令触发事务之后发生执行失败,其他命令还是会正常执行,不会回滚。

上一篇:Hive参数优化


下一篇:linux系统编程——进程管理——基础