redis設計與實現 書中說:
Redis的事務總是具有ACID中的原子性、一致性和隔離性,當伺服器運行在AOF
持久化模式下,並且appendfsync選項的值為always時,事務也具有耐久性。
可看網路資料,又說redis事務不滿足原子性和持久性:
在redis事務中如果有某一條命令執行失敗,其後的命令仍然會被繼續執行,並不會自動回滾;
在AOF的「總是 SYNC 」模式下,事務的每個指令在執行成功之後,都會立即呼叫fsync或fdatasync將事務資料寫入到AOF檔。
但是,這種保存是由後台線程進行的,主線程不會阻塞直到保存成功,所以從命令執行成功到資料保存到硬碟之間,還是有一段非常小的間隔,所以這種模式下的事務也是不持久的。
求解答~~
這個主要是對redis原子性有疑問,現在已經查證,redis是不確保原子性的,事務中命令執行失敗時,是不會回滾的。
首先redis是單線程的,所以其實是沒有事務這個概念的,除非使用mutil手動的將一組命令封裝到一起作為一個整體來執行,具體如果這個整體有一條指令失敗會不會回滾可以自己做個測試。
單線程所以每個命令都是原子性的,一致性和隔離性是針對事務來說的,redis的事務是通過將一組命令封裝到一起執行所以是隔離性的,因為阻塞了其他命令的執行,至於一致性,如果上面你做的測試會回滾那麼就是一致性的,不會滾那就不是一致性的。