Redis中事務ACID支持程度

事務是一個數據庫必備的元素,對於redis也不例外,對於一個傳統的關係型數據庫來講,數據庫事務知足ACID四個特性:redis

  • A表明原子性:一個事務(transaction)中的全部操做,要麼所有完成,要麼所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
  • C表明一致性:事務應確保數據庫的狀態從一個一致狀態轉變爲另外一個一致狀態。一致狀態的含義是數據庫中的數據應知足完整性約束
  • I表明隔離性:多個事務併發執行時,一個事務的執行不該影響其餘事務的執行
  • D表明持久性:已被提交的事務對數據庫的修改應該永久保存在數據庫中

然而,對於redis來講,只知足其中的:數據庫

一致性和隔離性兩個特性,其餘特性是不支持的。服務器

A原子性

單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增長任何維持原子性的機制,因此 Redis 事務的執行並非原子性的併發

若是一個事務隊列中的全部命令都被成功地執行,那麼稱這個事務執行成功async

另外一方面,若是 Redis 服務器進程在執行事務的過程當中被中止 —— 好比接到 KILL 信號、宿主機器停機,等等,那麼事務執行失敗工具

事務失敗時,Redis 也不會進行任何的重試或者回滾動做,不知足要麼所有所有執行,要麼都不執行的條件spa

C一致性

一致性分下面幾種狀況來討論:線程

首先,若是一個事務的指令所有被執行,那麼數據庫的狀態是知足數據庫完整性約束的code

其次,若是一個事務中有的指令有錯誤,那麼數據庫的狀態是知足數據完整性約束的隊列

最後,若是事務運行到某條指令時,進程被kill掉了,那麼要分下面幾種狀況討論:

  • 若是當前redis採用的是內存模式,那麼重啓以後redis數據庫是空的,那麼知足一致性條件
  • 若是當前採用RDB模式存儲的,在執行事務時,Redis 不會中斷事務去執行保存 RDB 的工做,只有在事務執行以後,保存 RDB 的工做纔有可能開始。因此當 RDB 模式下的 Redis 服務器進程在事 務中途被殺死時,事務內執行的命令,無論成功了多少,都不會被保存到 RDB 文件裏。 恢復數據庫須要使用現有的 RDB 文件,而這個 RDB 文件的數據保存的是最近一次的數 據庫快照(snapshot),因此它的數據可能不是最新的,但只要 RDB 文件自己沒有由於 其餘問題而出錯,那麼還原後的數據庫就是一致的

  • 若是當前採用的是AOF存儲的,那麼可能事務的內容還未寫入到AOF文件,那麼此時確定是知足一致性的,若是事務的內容有部分寫入到AOF文件中,那麼須要用工具把AOF中事務執行部分紅功的指令移除,這時,移除以後的AOF文件也是知足一致性的

因此,redis事務知足一致性約束

I隔離性

Redis 是單進程程序,而且它保證在執行事務時,不會對事務進行中斷,事務能夠運行直到執行完全部事務隊列中的命令爲止。所以,Redis 的事務是老是帶有隔離性的。

D持久性

由於事務不過是用隊列包裹起了一組 Redis 命令,並無提供任何額外的持久性功能,因此事務的持久性由 Redis 所使用的持久化模式決定

  • 在單純的內存模式下,事務確定是不持久的
  • 在 RDB 模式下,服務器可能在事務執行以後、RDB 文件更新以前的這段時間失敗,因此 RDB 模式下的 Redis 事務也是不持久的
  • 在 AOF 的「老是 SYNC 」模式下,事務的每條命令在執行成功以後,都會當即調用 fsync 或 fdatasync 將事務數據寫入到 AOF 文件。可是,這種保存是由後臺線程進行的,主線程不會阻塞直到保存成功,因此從命令執行成功到數據保存到硬盤之間,仍是有一段很是小的間隔,因此這種模式下的事務也是不持久的。
  • 其餘 AOF 模式也和「老是 SYNC 」模式相似,因此它們都是不持久的。
相關文章
相關標籤/搜索