天天看點

Redis 基本的事務操作

事務有 A C I D 原則

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

一次性、順序性、排他性,執行一系列的指令

Redis事務沒有隔離級别的概念!

所有的指令在事務中,并沒有直接被執行!隻有發起執行指令的适合才會執行!Exec

Redis單條指令是保證原子性的,但Redis的事務是不保證原子性的。

Redis的事務:

  • 開啟事務(multi)

127.0.0.1:6379> ping
PONG
127.0.0.1:6379> flushdb
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>      
Redis 基本的事務操作
  • 指令入隊(其他指令)

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      
Redis 基本的事務操作
  • 執行事務(exec)

127.0.0.1:6379> exec
1) OK
2) OK
3) "v2"
4) OK
127.0.0.1:6379>          
Redis 基本的事務操作

注意:事務執行完就不存在了,每次使用時候都要用multi指令開啟

  •  放棄事務(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> set k4 v4

QUEUED

127.0.0.1:6379> discard

OK

127.0.0.1:6379> get k4 #事務放棄了,擷取k4的值應該是空的

(nil)

127.0.0.1:6379>

Redis 基本的事務操作
  • 事務的異常處理

 ①編譯型異常(代碼有問題!指令有錯!),事務中所有的指令都不會被執行!

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> set k5 v5
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5
(nil)
127.0.0.1:6379>                                                                                   
Redis 基本的事務操作

 以上整個事務都沒有執行,擷取事務中設定的值為空!!

②運作時異常,如果事務隊列中存在文法性,那麼執行指令的時候,其他指令是可以被正常執行。錯誤指令會抛出異常。

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> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
4) "v3"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> get k3
"v3"      
Redis 基本的事務操作

 以上印證Redis是不保證原子性的。