四、Redis的事務

1、基本介紹

是什么?
可以一次執(zhí)行多個命令,本質是一組命令的集合。一個事物中的所有命令都會被序列化,按順序的串行執(zhí)行而不會被其他命令插入,不許加塞。

能干嘛?
一個隊列中,一次性的,順序的,排他的執(zhí)行一系列命令。

怎么玩?

命令 描述
multi 標記一個事務的開始
exec 執(zhí)行所有事務塊內的命令
discard 取消事務,放棄執(zhí)行事務塊內的所有命令
watch key [key] 監(jiān)視一個(或多個) key ,如果在事務執(zhí)行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。
unwatch 取消watch命令對所有 key 的監(jiān)視。
  1. 正常執(zhí)行
  1. 放棄事務
  1. 全體連坐(一次出錯,全體命令不執(zhí)行)
  1. 冤頭債主(由此可見Redis只是部分支持事務)

2、watch監(jiān)控

悲觀鎖與樂觀鎖:鎖機制參考

watch指令,類似樂觀鎖,如果key的值已經被修改了,那么整個事務隊列都不會被執(zhí)行,同時返回一個Nullmulti-bulk應答以通知調用者事務執(zhí)行失敗。

注意:一旦執(zhí)行了exec或者discard,之前加的所有監(jiān)控鎖都會被取消掉了。

例子:

  • 初始化信用卡的可用余額和欠額

  • 無加塞篡改,先監(jiān)控再開啟multi,保證兩筆金額變動在同一個事務內

  • 有加塞篡改,當watch的key被修改,后面的那個事務全部執(zhí)行失敗

  • unwatch,若在watch中key被修改,則先進行unwatch,然后重新watch監(jiān)控

3階段

  • 開啟:以 multi 開啟事務;
  • 入隊:將多個命令入隊到事務中,接到這些命令不會立刻執(zhí)行,而是放到等待執(zhí)行的事務隊列里面;
  • 執(zhí)行:有 exec 命令觸發(fā)事務。

3特性

單獨的隔離操作:事務中的所有命令都會序列化,按順序的執(zhí)行。事務在等待執(zhí)行的時候,不會被其他客戶端發(fā)送來的米命令請求打斷。

沒有隔離級別的概念:隊列中的所有命令沒有提交exec之前都是不會被執(zhí)行的。

不保證原子性:redis中如果一條命令執(zhí)行失敗,其后的命令仍然會被執(zhí)行,沒有回滾,參考“冤頭債主”

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容