事務是一個數據庫必備的元素,對於redis也不例外,對於一個傳統的關係型數據庫來講,數據庫事務知足ACID四個特性:redis
然而,對於redis來講,只知足其中的:數據庫
一致性和隔離性兩個特性,其餘特性是不支持的。服務器
單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增長任何維持原子性的機制,因此 Redis 事務的執行並非原子性的併發
若是一個事務隊列中的全部命令都被成功地執行,那麼稱這個事務執行成功async
另外一方面,若是 Redis 服務器進程在執行事務的過程當中被中止 —— 好比接到 KILL 信號、宿主機器停機,等等,那麼事務執行失敗工具
事務失敗時,Redis 也不會進行任何的重試或者回滾動做,不知足要麼所有所有執行,要麼都不執行的條件spa
一致性分下面幾種狀況來討論:線程
首先,若是一個事務的指令所有被執行,那麼數據庫的狀態是知足數據庫完整性約束的code
其次,若是一個事務中有的指令有錯誤,那麼數據庫的狀態是知足數據完整性約束的隊列
最後,若是事務運行到某條指令時,進程被kill掉了,那麼要分下面幾種狀況討論:
若是當前採用RDB模式存儲的,在執行事務時,Redis 不會中斷事務去執行保存 RDB 的工做,只有在事務執行以後,保存 RDB 的工做纔有可能開始。因此當 RDB 模式下的 Redis 服務器進程在事 務中途被殺死時,事務內執行的命令,無論成功了多少,都不會被保存到 RDB 文件裏。 恢復數據庫須要使用現有的 RDB 文件,而這個 RDB 文件的數據保存的是最近一次的數 據庫快照(snapshot),因此它的數據可能不是最新的,但只要 RDB 文件自己沒有由於 其餘問題而出錯,那麼還原後的數據庫就是一致的
若是當前採用的是AOF存儲的,那麼可能事務的內容還未寫入到AOF文件,那麼此時確定是知足一致性的,若是事務的內容有部分寫入到AOF文件中,那麼須要用工具把AOF中事務執行部分紅功的指令移除,這時,移除以後的AOF文件也是知足一致性的
因此,redis事務知足一致性約束
Redis 是單進程程序,而且它保證在執行事務時,不會對事務進行中斷,事務能夠運行直到執行完全部事務隊列中的命令爲止。所以,Redis 的事務是老是帶有隔離性的。
由於事務不過是用隊列包裹起了一組 Redis 命令,並無提供任何額外的持久性功能,因此事務的持久性由 Redis 所使用的持久化模式決定
fsync
或 fdatasync
將事務數據寫入到 AOF 文件。可是,這種保存是由後臺線程進行的,主線程不會阻塞直到保存成功,因此從命令執行成功到數據保存到硬盤之間,仍是有一段很是小的間隔,因此這種模式下的事務也是不持久的。