Redis學習-11 事物講解
阿新 • • 發佈:2020-08-01
事物的本質:一組命令的集合!一個事物中的所有命令都會被序列化,在事物執行過程中,會按照順序執行!
特點:一次性、順序性、排他性!執行一系列的命令!
Redis事物沒有隔離級別的概念!
所有的名令在事物中,並沒有直接被執行!只有發起執行命令的時候才會執行! Exec
Redis單條命令是保證原子性的,但事物不保證原子性
redis的事務步驟:
- 開啟事務(multi)
- 命令入隊()
- 執行事務(exec)
127.0.0.1:6379> multi #開啟事務 OK 127.0.0.1:6379> set k1 v1 #命令入隊 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED127.0.0.1:6379> get k2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> exec #執行事務(注意,這個事務執行完後就消失了,需要事務的話需要重新開啟) 1) OK 2) OK 3) "v2" 4) OK
127.0.0.1:6379> multi #再次開啟事務
OK
127.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 #放棄事務,放棄後這個事務中的所有命令都會失效
OK
127.0.0.1:6379> get k4 #所以k4為空
(nil)
- 編譯型異常(程式碼有問題!命令有錯!):事務中所有的命令都不會執行!
- 執行時異常(如1/0):如果事務佇列中存在語法錯誤,那麼執行命令的時候,其它命令仍然可以正常執行的。
編譯時異常的案例
127.0.0.1:6379> multi OK 127.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 argumentsfor '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> set k1 v1 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> incr k1 #對一個字串+1,編譯時沒有異常 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> get k2 QUEUED 127.0.0.1:6379> exec 1) (error) ERR value is not an integer or out of range #執行時丟擲異常,但不影響其它語句的執行 2) OK 3) "v2"