乐趣区

关于redis:Redis第六章节事务

目录

  • 简介
  • 执行过程
  • 特点
  • 案例
  • watch

简介

事务(Transaction),个别是指要做的或所做的事件。在计算机术语中是指拜访并可能更新数据库中各种数据项的一个程序执行单元(unit)。

执行过程

开始事务 -> 命令入队 -> 执行事务。

特点

① 批量操作在发送 exec 命令前被放入队列缓存。
② 收到 exec 命令后进入事务执行,事务中任意命令执行失败,其余的命令仍然会被执行。
③ 在事务的执行过程中,其余客户端提交的命令申请不会插入到事务执行命令的序列中。

案例:

  • (1)失常执行

      localhost:6379> multi
      OK
      localhost:6379> set a 1111
      QUEUED
      localhost:6379> set b 2222
      QUEUED
      localhost:6379> set c 3333
      QUEUED
      localhost:6379> set d 4444
      QUEUED
      localhost:6379> exec
      1) OK
      2) OK
      3) OK
      4) OK
  • (2)勾销事务

      localhost:6379> multi
      OK
      localhost:6379> set e 55555
      QUEUED
      localhost:6379> set f 66666
      QUEUED
      localhost:6379> discard
      OK
      localhost:6379> exec
      (error) ERR EXEC without MULTI
  • (3)编译型谬误

    最初执行 exec 命令之后,会执行队列中的命令,队列中命令有失败的,所以最初整个命令都执行失败。
    编译型异样代码有问题,命令有错,事务中所有的命令都不会被执行。
  • (4)运行时谬误

        localhost:6379> set a qqqq
        OK
        localhost:6379> multi
        OK
        localhost:6379> incr a
        QUEUED
        localhost:6379> set b 1111
        QUEUED
        localhost:6379> set c 2222
        QUEUED
        localhost:6379> set d 3333
        QUEUED
        localhost:6379> exec
        1) (error) ERR value is not an integer or out of range
        2) OK
        3) OK
        4) OK
        localhost:6379> keys *
        1) "a"
        2) "c"
        3) "b"
        4) "d"

    如果事务队列存在语法错误,那么执行命令的时候,其余命令是能够失常执行的,谬误命令抛出异样。

watch

Watch 命令用于监督一个(或多个) key,如果在事务执行之前这个(或这些) key 被其余命令所改变,那么事务将被打断。

  • 监控 a 时,a被批改

      // 客户端 1
        localhost:6379> set a 1111
        OK
        localhost:6379> WATCH a
        OK
        localhost:6379> MULTI
        OK
        localhost:6379> set a 2222
        QUEUED
        localhost:6379> exec
        (nil)
    
      // 客户端 2
        127.0.0.1:6379> set a 567
        OK
  • 失常watch

      localhost:6379> set a 1111
      OK
      localhost:6379> WATCH a
      OK
      localhost:6379> MULTI
      OK
      localhost:6379> set b 222
      QUEUED
      localhost:6379> set c 333
      QUEUED
      localhost:6379> set d 444
      QUEUED
      localhost:6379> exec
      1) OK
      2) OK
      3) OK
      localhost:6379> keys *
      1) "a"
      2) "c"
      3) "b"
      4) "d"
    
退出移动版