1. 程式人生 > 資料庫 >Redis設計與實現(四)——事務

Redis設計與實現(四)——事務

Redis也提供事務機制來滿足ACID性質。

事務的實現

事務的整個過程會經歷三個階段:

  1. 事務開始
    MULTI命令標誌著事務的開始。
  2. 命令入隊
    如果客戶端傳送的是EXEC DISCARD WATCH MULTI四個命令,那麼就會立即執行,其他的命令只會放入事務佇列中等待執行。
  3. 事務執行
    當伺服器接收到了EXEC命令之後,將被伺服器立即執行,伺服器會遍歷這個客戶端的事務佇列,執行所有儲存的命令,最後將所得的結果都返回給客戶端。

WATCH命令的實現

WATCH命令是一個樂觀鎖,它可以在EXEC命令執行之前,監視任意數量的資料庫鍵,檢查被監視的鍵是否至少有一個已經被修改過了,如果是的花,伺服器將拒絕執行事務,並向客戶端返回事務失敗的回覆。

WATCH監視機制
Redis通過一個字典資料結構標記每個被監視的鍵,鍵對應的值就是監視的客戶端序號,如發生資料該表,相應的客戶端的標誌將會被置位,表示事務的安全性已經被破壞了。在之後的EXEC命令執行之前,就會查詢這個字典,確定事務安全。

事務的ACID性質

原子性

對於Redis事務功能,事務佇列中的命令要麼都執行,要麼都不執行,這就體現了其原子性。

不同於傳統的關係型資料庫,Redis不支援事務回滾機制,如果事務佇列的執行中發生了錯誤,整個事務還是會繼續執行。這樣設計的原因是,回滾機制太複雜,這種錯誤一般都是後臺程式的問題,也只會出現來開發的環境中,實際的生產環境中很少出現,所以沒必要。

一致性

一致性就是指在事務執行前後資料也是保持一致的。
Redis通過錯誤檢測和簡單的設計保證事務的一致性。

  1. 入隊錯誤
    在事務命令入隊的過程中,發現命令有問題,就會不執行這個事務。
  2. 執行錯誤
    在實際執行過程中,發生了錯誤,伺服器不會中斷事務的執行。這種錯誤不會對資料庫產生修改,也就不會影響一致性。
  3. 伺服器停機
    如果在執行事務的過程中停機,那麼會伺服器所使用的持久化模式,保持資料的一致。

隔離性

Redis採用單執行緒的方式來執行事務,並且伺服器保證事務執行期間不會被中斷,事務總是以序列的方式執行,所以是具有隔離性的。

永續性

Redis的RDB和AOF就滿足了永續性的要求。