事物的本質:一組命令的集合!乙個事物中的所有命令都會被序列化,在事物執行過程中,會按照順序執行!
特點:一次性、順序性、排他性!執行一系列的命令!
redis事物沒有隔離級別的概念!
所有的名令在事物中,並沒有直接被執行!只有發起執行命令的時候才會執行! exec
redis單條命令是保證原子性的,但事物不保證原子性
redis的事務步驟:
開啟事務(multi)
命令入隊()
執行事務(exec)
127.0.0.1:6379>multi #開啟事務127.0.0.1:6379>multi #再次開啟事務ok127.0.0.1:6379> set
k1 v1 #命令入隊
queued
127.0.0.1:6379> set
k2 v2
queued
127.0.0.1:6379> get
k2queued
127.0.0.1:6379> set
k3 v3
queued
127.0.0.1:6379>exec #執行事務(注意,這個事務執行完後就消失了,需要事務的話需要重新開啟)
1) ok
2) ok
3) "v2"
4) ok
ok127.0.0.1:6379>
127.0.0.1:6379> set k1 v1
queued
127.0.0.1:6379> set k2 v2
queued
127.0.0.1:6379> set k4 v4
queued
127.0.0.1:6379>discard #放棄事務,放棄後這個事務中的所有命令都會失效
ok127.0.0.1:6379> get k4 #所以k4為空
(nil)
編譯時異常的案例127.0.0.1:6379>multi
ok127.0.0.1:6379> set
k1 v1
queued
127.0.0.1:6379> set
k2 v2
queued
127.0.0.1:6379> set
k3 v3
queued
127.0.0.1:6379>getset k3 #故意寫乙個錯誤的命令
(error) err wrong number of arguments
for'
getset
'command #編譯時異常
127.0.0.1:6379> set
k4 v5
queued
127.0.0.1:6379>exec #執行事務,發現報錯
(error) execabort transaction discarded because of previous errors.
127.0.0.1:6379> get
k1 #所有的命令都未執行
(nil)
執行時異常的案例127.0.0.1:6379> setk1 v1
ok127.0.0.1:6379>multi
ok127.0.0.1:6379> incr k1 #對乙個字串+1,編譯時沒有異常
queued
127.0.0.1:6379> setk2 v2
queued
127.0.0.1:6379> getk2
queued
127.0.0.1:6379>exec
1) (error) err value is not an integer or outof range #執行時丟擲異常,但不影響其它語句的執行
2) ok
3) "v2"
redis學習 事物,生存時間
事物 1 multi exec 2 錯誤處理 語法錯誤可以檢測到,執行錯誤無法檢測,即使事物裡一條命令出現了語法錯誤,事物裡其他的命令依然會繼續執行 3 watch 檢測鍵值被修改後阻止之後的乙個事物的執行,並不能保證其他客戶端不修改這個鍵值 unwatch可以取消監控 生存時間 expire ke...
Redis學習筆記三 redis事物及鎖的應用
redis和mysql一樣,也支援簡單的事物,並且redis還可以對key進行加鎖,防止同時對某一key操作而導致資料錯誤 一 redis與mysql事物比較 mysql redis 開啟語句 start transaction muitl 事物語句 普通sql 普通redis命令 執行失敗 rol...
redis 管道和事物
redis是單執行緒的,一次請求伺服器,請求發出後,如果伺服器響應沒有回來,就一直阻塞。在傳送下乙個請求 redis管道,就是吧命令 都傳送了。不關心是否有響應。然後最後集中去接收響應結果 管道 不會接收其他非管道命令。redis事物。muti mutiget exec watch監視key 基於c...