事務
Redis單條命令式保證原子性的,但是事務不保證原子性
Redis事務本質:一組命令的集合,一個事務中的所有命令都會被序列化,在事務執行過程的中,會按照順序執行
- 一次性:在隊列裏一次性執行
- 順序性:按照隊列順序執行
- 排他性:在執行的過程中是不允許干擾的
-------- 隊列 set set set 執行 --------
Redis事務沒有沒有隔離級別的概念
所有的命令在事務中,並沒有直接被執行,只有發起執行命令的時候纔會執行
redis的事務
- 開啓事務(multi)
- 命令入隊(......)
- 執行事務(exec) 放棄事務(discard)
正常執行事務
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> 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 # 事務隊列中的命令都不會被執行
(nil)
編譯型異常(代碼有問題,命令有錯)
事務中所有的命令都不會被執行
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 v4
QUEUED
127.0.0.1:6379> exec # 執行事務報錯
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k1 # 所有的命令都不會被執行
(nil)
運行時異常( 1/0 )
如果事務隊列中存在語法性錯誤,那麼執行命令的時候,其他命令式可以正常執行的
127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1 # 執行時會失敗
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"
127.0.0.1:6379> get k2
"v2"