1. 程式人生 > >Redis-10Redis的事務回滾

Redis-10Redis的事務回滾

概述

對於 Redis 而言,不單單需要注意其事務處理的過程,其回滾的能力也和資料庫不太一樣,這也是需要特別注意的一個問題一Redis 事務遇到的命令格式正確而資料型別不符合 ,如下所示。

場景一: 命令格正確,資料型別錯誤

127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 value1
QUEUED
127.0.0.1:6379> SET key2 value2
QUEUED
127.0.0.1:6379> INCR key1
QUEUED
127.0.0.1:6379> DEL key2
QUEUED
127.0
.0.1:6379> EXEC 1) OK 2) OK 3) (error) ERR value is not an integer or out of range 4) (integer) 1 127.0.0.1:6379> GET key1 "value1" 127.0.0.1:6379> GET key2 (nil) 127.0.0.1:6379>

我們將 key1 設定為字串,而使用命令 incr 對其自增,但是命令只會進入事務佇列,而沒有被執行,所以它不會有任何的錯誤發生,而是等待 exec 命令的執行。

當 exec 命令執行後,之前進入佇列的命令就依次執行,當遇到 incr 時發生命令操作的資料型別錯誤,所以顯示出了錯誤,而其之前和之後的命令都會被正常執行.

場景二:命令格式錯誤

注意,這裡命令格式是正確的,問題在於資料型別,對於命令格式是錯誤的卻是另外一種情形 如下所示

127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 value1
QUEUED
127.0.0.1:6379> incr
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> set key2 value2
QUEUED
127.0.0.1:6379> EXEC
(error)
EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> GET key1 (nil) 127.0.0.1:6379> GET key2 (nil) 127.0.0.1:6379>