標籤:
前面主要介紹了redis資料類型,這裡講下事務問題
NoSQL都不支援事務,雖然Redis的Transactions提供的並不是嚴格的ACID的事務(比如一串用EXEC
提交執行的命令,在執行中伺服器宕機,那麼會有一部分命令執行了,剩下的沒執行),
但是這個Transactions還是提供了基本的命令打包執行的功能(在伺服器不出問題的情況下,
可以保證一連串的命令是順序在一起執行的,中間有會有其它用戶端命令插進來執行)。
Redis還提供了一個Watch功能,你可以對一個key進行Watch,然後再執行Transactions,
在這過程中,如果這個Watched的值進行了修改,那麼這個Transactions會發現並拒絕執行。
Session 1 (1)第1步 redis 127.0.0.1:6379> get age "10" redis 127.0.0.1:6379> watch age OK redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> Session 2 (2)第2步 redis 127.0.0.1:6379> set age 30 OK redis 127.0.0.1:6379> get age "30" redis 127.0.0.1:6379> Session 1 (3)第3步 redis 127.0.0.1:6379> set age 20 QUEUED redis 127.0.0.1:6379> exec (nil) redis 127.0.0.1:6379> get age "30" redis 127.0.0.1:6379> 第一步,Session 1 還沒有來得及對age的值進行修改 第二步,Session 2 已經將age的值設為30 第三步,Session 1 希望將age的值設為20,但結果一執行返回是nil,說明執行失敗,之後我們再取一下age的值是30,這是由於Session 1中對age加了樂觀鎖導致的。
redis Transaction支援