一般的 事務簡單來說就是 一系列的操作保證原子性,成功都成功~失敗都失敗,
但是!但是!但是! redis 的事務在執行中出錯時,錯的將會被忽略,佇列之后的指令依然可以執行,一旦出現這種情況 需要手動回滾,
redis 的事務僅僅保證了所有的操作都會嚴格的 按照原子操作來執行,不保證所有的都是成功的,這需要開發者自己來約束,
開啟和執行
如何開啟事物并開始執行
multi
設定事務的開啟位置,此指令執行后,后續的所有指令均加入到事務中,
exec
設定事務的結束位置,同時執行事務,與multi成對出現,成對使用
注意
加入事務的命令暫時到任務佇列中,沒有立即執行,在一切順利的情況下(在nulti 和 exec 之間沒有出現error)只有執行exec命令才開始執行,
取消事務
將 multi 之后但還沒有 exec 的事物取消掉
主動
discard
終止當前事務定義,發生在multi之后,exec之前,
被動
語法錯誤
在事務的定義階段,也就是 multi 和 exec 之間存在語法錯誤,那么整個事務佇列將會被洗掉,
當redis事務開始執行,就不在乎是否全部成功,即使存在error 后面的也會執行,需要手動回滾,
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name monkey
QUEUED
127.0.0.1:6379> set gender male or female # 執行這行會報錯
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> exec
1) OK # name 設定成功了
2) (error) ERR syntax error # gender 失敗
3) "monkey" # 錯誤之后的也會執行~ 這事務 很蛋疼~~
127.0.0.1:6379>
手動進行事務回滾
記錄狀態
將操作程序中被影響的資料提前備份記錄
單資料:string
多資料:hash,list,set,zset
恢復狀態
使用之前備份的資料恢復事務操作之前的資料,
單資料:直接set(注意周邊屬性,例如時效)
多資料:修改對應值或整體克隆復制
事務的作業流程

watch
場景
假如在線商城的某個貨物售空了,此時有多個業務員可以進行補貨操作,但是又希望在賣的商品不能超過100個,應該怎么辦?
分析
這幾個業務員不可能每次補貨之前都溝通一下,因此必須要保證每次只能有一個人來操作資料,并且資料一旦被修改,就不需要其他人在修改了,一旦多個人同時修改,則只有一個人能修改成功,
解決方案
對 key 添加監視鎖,在執行exec前如果 key 發生了變化,終止事務執行
watch key1 [key2…] # 可以同時監視多個變數
取消對所有key的監視
unwatch # 取消對所有key的監視
我們先對當前的 貨物數 進行監視,對補貨操作開啟事務,如果在執行事務 exec 之前 數量變了,表示已經有人進行了補貨操作,因此終止事務,如果一切順利,成功的補貨完成,

注意 在 watch 物件改變時,事務佇列中所有的操作都不會被執行,就是說事務佇列直接被銷毀,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/16416.html
標籤:NoSQL
上一篇:求PB開發TSC條碼列印TSCLib.dll的例子,官方沒有PB的:(
下一篇:pb2017,下載后怎么破解?
