1. 程式人生 > 實用技巧 >Redis學習-11 事物講解

Redis學習-11 事物講解

事物的本質:一組命令的集合!一個事物中的所有命令都會被序列化,在事物執行過程中,會按照順序執行!

特點:一次性、順序性、排他性!執行一系列的命令!

Redis事物沒有隔離級別的概念!

所有的名令在事物中,並沒有直接被執行!只有發起執行命令的時候才會執行! Exec

Redis單條命令是保證原子性的,但事物不保證原子性

redis的事務步驟:

  1. 開啟事務(multi)
  2. 命令入隊()
  3. 執行事務(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
QUEUED
127.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 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> 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"