Redis学习笔记五:独立功能之事务
Redis 事務提供了一種將多個命令請求打包,然后一次性、按順序地執行多個命令的機制,并且在事務執行期間,服務器不會中斷,會將事務中的所以命令都執行完畢才去處理其他客戶端的命令請求。
事務的實現
事務開始
MULTI 命令意味著事務的開始。
事務從開始到結束包含三個階段:事務開始、命令入隊、事務執行。
multi 命令將執行命令的客戶端從非事務切換到事務狀態,這一切換是通過在客戶端狀態的 flags 屬性中打開 REDIS_MULTI 標識完成的。返回客戶端 OK。
命令入隊
在事務狀態中,服務器會立刻執行 exec、discard、watch、multi 四個命令中的一個,而非這些命令將會放入事務事務隊列,然后返回 QUEUED。
事務隊列
每個 Redis 客戶端都有自己的事務狀態,這個事務狀態保存在客戶端狀態的 mstate 屬性里:
執行事務
當一個處于事務狀態的客戶端向服務器發送 exec 命令時,這個 exec 命令將立刻被服務器執行,遍歷事務隊列執行所有命令,最后將執行命令所得的結果全部返回給客戶端。
watch 命令的實現
watch 命令是個樂觀鎖,它可以在 exec 命令執行前,監視任意數量的數據庫鍵。當發現有修改則拒絕事務執行并向客戶端返回代表事務執行失敗的空回復。
使用 watch 命令監視數據庫鍵
每個 Redis 數據庫都保存著一個 watched_keys 字典,鍵是被 watch 命令監視的數據庫鍵,字典值是所有監視這個鍵的客戶端鏈表。
監視機制的觸發
所有對于數據庫進行修改的命令執行后都會調用 multi.c/touchWatchKey 函數對 watched_keys 字典進行檢查,如果有客戶端正在監視剛剛被命令修改過的數據庫鍵,touchWatchKey 函數會將監視被修改鍵的客戶端的 REDIS_DIRTY_CAS 標識打開,表示客戶端的事務安全性被破壞。
判斷事務是否安全
當服務器收到客戶端發來的 exec 命令時,服務器會根據這個客戶端是否打開了 REDIS_DIRTY_CAS 標識來決定是否執行事務。
事務的 ACID 性質
A:Atomicity,原子性;
C:Consistency,一致性;
I:Isolation,隔離性;
D:Durability,耐久性。
原子性
原子性是指將事務中的多個操作作為一個整體來執行,要么全部執行成功,要么一個都不執行。Redis 不支持事務回滾機制,即使事務隊列中的某個命令在執行期間出現了錯誤,整個事務也會繼續執行下去,直到將事務隊列中的所有命令都執行完畢為止。
一致性
如果數據庫在執行事務之前是一致的,那么在事務執行之后無論事務是否執行成功,數據庫應該是一致的。一致是指數據符合數據庫本身的定義和要求,沒有包含非法或者無效的錯誤數據。
隔離性
即使數據庫有多個事務并發地執行,各個事務之間也不會互相影響,并發和串行狀態事務產生的結果完全相同。
耐久性
當一個事務執行完畢時,執行這個事務所得到的結果已經被保存到永久存儲介質里,即使事務執行完畢后停機,執行事務的結果也不會丟失。
轉載于:https://www.cnblogs.com/liushijie/p/5095297.html
總結
以上是生活随笔為你收集整理的Redis学习笔记五:独立功能之事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想小新笔记本怎么设备u盘 如何在联想小
- 下一篇: 【SQL-分组合并字符串】把相同分组的某