組合語言-17直接定址表
阿新 • • 發佈:2020-10-22
Redis通過MULTI、EXEC、WATCH等命令來實現事務(transaction)功能。
事務階段
一個事務會經歷三個階段:事務開始、命令入隊、事務執行
事務開始
MULTI將客戶端從非事務狀態切換到事務狀態,通過將客戶端的Flags屬性REDIS_MULTI開啟實現的。
命令入隊
每個客戶端都有自己的事務狀態,儲存在RedisClient物件的mstate中
事務執行
當一個處於事務的客戶端執行EXEC的時候,服務端會遍歷客戶端的事務佇列,遍歷執行,然後把結果返回給客戶端。
Watch命令的實現
Watch是一個樂觀鎖,當一個鍵被監視之後,就會放入watched_keys字典中,字典的鍵是watch的鍵,值是監視的客戶端。
當有資料庫進行修改的命令時,會通過touchWatchKey函式將被修改的客戶端的REDIS_DIRTY_CAS標識開啟,標識客戶端的安全性已經破壞。
當執行EXEC的時候,判斷是否是否安全,如下
事務的ACID
原子性
Redis事務不支援回滾機制,出現命令錯誤的時候(非命令入隊錯誤),也會執行下面的操作,所以本質上來說並不具備隔離性
隔離性
Redis是以單執行緒方式執行的,所以具備天然的事務隔離。
一致性
一致性是指系統從一個正確的狀態,遷移到另一個正確的狀態
永續性
當伺服器執行在AOF持久化模式下,並且appendfsync選項的值為always時,事務也具有耐久性。