Redis-第六章節-事務

Tsing發表於2021-01-30

目錄

  • 簡介
  • 執行過程
  • 特點
  • 案例
  • 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)編譯型錯誤
    redis-error
    最後執行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"
    
    

相關文章