1. 程式人生 > 實用技巧 >redis學習-簡單事務

redis學習-簡單事務

前言

redis沒有關係型資料庫那麼強的事務控制。僅可以使用multi、exec、discard等命令實現簡單的事務控制。但是事務不會因為操作失敗而回滾,也不保證全部成功。(所以≈沒卵用)只是單純的事務內操作順次提交而已。

開啟事務

使用multi命令開啟事務,開啟事務後執行的操作會進入一個佇列,事務提交後順次執行。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zmc
QUEUED							<==================操作進入佇列
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set sex male
QUEUED

提交事務

使用exec命令提交事務後,從佇列中順次執行操作,並返回執行結果。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zmc
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set sex male
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"

放棄事務

使用discard命令放棄事務提交後,退出事務狀態,且不提交之間的操作。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name1 RzZ
QUEUED
127.0.0.1:6379> set name2 DT
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"

事務失敗

  1. 失敗不回滾

    當一個事務中,某一個操作失敗時,redis並不會將已執行的操作進行回滾。

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set addr sz
    QUEUED
    127.0.0.1:6379> incr age
    QUEUED
    127.0.0.1:6379> incr name
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) (integer) 19
    3) (error) ERR value is not an integer or out of range	<=============這裡執行失敗了
    127.0.0.1:6379> keys *
    1) "sex"
    2) "age"
    3) "addr"
    4) "name"
    127.0.0.1:6379> get age
    "19"													<=============但是這兩個操作正常提交了
    127.0.0.1:6379> get addr
    "sz"
    
  2. 失敗不中斷

    事務執行時必然執行完所有操作,即時中間丟擲錯誤,也不影響後面的操作。

    127.0.0.1:6379> exec
    1) (integer) 20
    2) (error) ERR value is not an integer or out of range	<=============這裡執行失敗了
    3) (integer) 1
    127.0.0.1:6379> get age
    "20"
    127.0.0.1:6379> get addr
    (nil)													<=============但是這個操作正常提交了