四 Redis事務處理

2022-01-23 17:07:49 字數 1459 閱讀 9253

redis目前對事務的支援還是比較簡單,redis能保證乙個client發起的事務中的命令可以連續執行,而中間不會插入其他client的命令;當乙個client在連線中發起乙個multi命令的時候,這個連線會進入事務上下文,而連線後續的命令不會立即執行,而是先放到乙個佇列中,當執行exec命令的時候,redis會順序的執行該佇列中的所有命令。

redis事務涉及的命令關鍵字:multi 進入乙個事務上下文,exec 執行事務 ,discard 回滾事務 , watch 事務樂觀鎖

在sqlserver 或 mysql 當中的事務(當事務中操作出現錯誤的時候,會完全回滾事務)。但是在 redis 中會有些不一樣。

可以從下面命令執行過程中看到:

127.0.0.1:6379> set age 10

ok127.0.0.1:6379> set name hexu

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> incr age

queued

127.0.0.1:6379> incr name

queued

127.0.0.1:6379> exec

1) (integer) 11

2) (error) err value is not an integer or out of range

127.0.0.1:6379> get age

"11"

127.0.0.1:6379> get name

"hexu"

key["age"]是乙個int,key["name"]是乙個字串,當我們通過incr命令遞增age和name的時候,name出現錯誤,最後我們執行exec命令,age的結果沒有回滾。這就redis需要改進的地方。

事務樂觀鎖

watch 命令會監視給定的key ,當exec時候,如果監視的key發生過變化,則整個事務失敗。

當有多個session時,seesion1 首先開啟事務,對 age 賦值為 100,此時事務暫時未被exec。session2使用非事務方式對 age 賦值為 120,賦值完成。然後 session1執行 exec命令。當乙個key被加上樂觀鎖的時候,該事務會執行失敗。

session1:

127.0.0.1:6379> watch age      第一步

ok127.0.0.1:6379> multi          第二步

ok127.0.0.1:6379> set age 100      第三步

queued

127.0.0.1:6379> exec          第五步

(nil)

session2:

127.0.0.1:6379> set age 120      第四步

ok使用 exec,discard,unwatch 命令都會清除連線中的監視

redis事務處理

資料acid特性滿足了幾條?為了保持簡單,redis事務保證了其中的一致性和隔離性 不滿足原子性和永續性 redis事務在執行的中途遇到錯誤,不會回滾,而是繼續執行後續命令 違反原子性 事務可以理解為乙個打包的批量執行指令碼,但批量指令並非原子化的操作 中間某條指令的失敗不會導致前面已做指令的回滾,...

redis事務處理

1 multi命令用於開啟乙個事務,它總是返回ok multi執行之後,客戶端可以繼續向伺服器傳送任意多條命令,這些命令不會立即被執行,而是被放到乙個佇列中 2 exec命令被呼叫時,所有佇列中的命令才會被執行 multi ok incr foo queued set t1 1 queued exe...

Redis 事務處理

眾所周知,事務是指 乙個完整的動作,要麼全部執行,要麼什麼也沒有做 在聊 redis 事務處理之前,要先和大家介紹四個redis指令,即multi exec discard watch。這四個指令構成了redis事務處理的基礎。呼叫 exec 之前的錯誤 語法錯誤 呼叫exec之前的錯誤 有可能是由...