Redis-第六章節-事務

目錄

  • 簡介
  • 執行過程
  • 特色
  • 案例
  • watch

簡介

事務(Transaction),通常是指要作的或所作的事情。在計算機術語中是指訪問並可能更新數據庫中各類數據項的一個程序執行單元(unit)。java

執行過程

開始事務 -> 命令入隊 -> 執行事務。redis

特色

① 批量操做在發送 exec 命令前被放入隊列緩存。
② 收到exec命令後進入事務執行,事務中任意命令執行失敗,其他的命令依然會被執行。
③ 在事務的執行過程當中,其餘客戶端提交的命令請求不會插入到事務執行命令的序列中。shell

案例:

  • (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)編譯型錯誤
    redis-error
    最後執行exec命令以後,會執行隊列中的命令,隊列中命令有失敗的,因此最後整個命令都執行失敗。
    編譯型異常代碼有問題,命令有錯,事務中全部的命令都不會被執行。code

  • (4)運行時錯誤blog

    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"
相關文章
相關標籤/搜索