redis學習-簡單事務
阿新 • • 發佈:2020-08-11
前言
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"
事務失敗
-
失敗不回滾
當一個事務中,某一個操作失敗時,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"
-
失敗不中斷
事務執行時必然執行完所有操作,即時中間丟擲錯誤,也不影響後面的操作。
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) <=============但是這個操作正常提交了