文章目錄
- Redis 事務
- 執行事務
- 放棄事務
- 編譯性異常
- 運行時異常
Redis 事務
Redis 單條明令是原子性的,但Redis事務不保證原子性。
事務的本質就是:一組命令一起執行!一個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行!
一次性、順序性、排他性。
Redis事務沒有隔離級別的概念。 所有的命令在事務中,并沒有被直接執行!只有在發起執行命令的時候才會執行!
原子性:要么一起成功,要么一起失敗。
執行事務
Redis 事務:
- 開啟事務(multi);
- 命令入隊;
- 執行事務(exec)。
127.0.0.1:6379> multi # 開啟事務
OK
127.0.0.1:6379(TX)> set k1 v1 # 命令入隊
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> exec # 執行事務
1) OK
2) OK
3) "v2"
4) OK
放棄事務
放棄事務后,隊列中的命令都沒有執行!
127.0.0.1:6379> multi # 開啟事務
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> set k1 v11
QUEUED
127.0.0.1:6379(TX)> discard # 放棄事務
OK
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> get k1
"v1"
編譯性異常
代碼有問題,命令有錯!事務中所有的命令都不會執行!
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> getset k3 # 錯誤的命令,客戶端會給出錯誤提示,但不會斷開事務
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379(TX)>
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> set k5 v5
QUEUED
127.0.0.1:6379(TX)> exec # 執行會報錯
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5 # 事務中的命令都沒有執行
(nil)
運行時異常
如果事務隊列中存在語法性錯誤,那么執行命令的時候,其他命令是可以執行的!錯誤命令會拋出異常!(所以說沒有原子性)
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> incr k1 # 這是一條有問題的命令(執行時會報錯)
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> incr k1 # 錯誤命令入隊
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec # 有錯誤的命令報錯了,其他命令成功了
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) OK