Cassandra不會使用回滾和鎖機制來實現關係型數據的ACID事務,相比較於提供原子性,隔離性和持久化,Cassandra提供最終(可調節的)一致性,讓用戶決定爲每一個事務提供強一致性或者最終一致性。html
做爲非關係型數據庫,Cassandra不支持join或者外鍵,所以Cassandra不提供ACID層面的一致性。例如,當從帳戶A轉帳給帳戶B,整個帳戶總額不該該改變。Cassandra支持row-level的原子性和隔離性,爲了提供高可用和更快的寫入性能,犧牲了事務的隔離性和原子性。Cassandra寫操做是持久化的。數據庫
在Cassandra中,寫入操做時partition level的原子性,意味着同一分區的2行或者多行的寫入或者更新被當作同一寫入操做。刪除操做一樣是partition level。markdown
例如,若是寫一致性爲QUORUM,relication factor爲3,Cassandra會將寫操做複製到集羣中的全部的節點,而後等待2個節點的應答。若是某個節點寫入失敗了可是其餘節點成功了,Cassandra會在失敗的節點報告失敗。然而,其餘成功寫入的節點不會自動進行回滾。性能
Cassandra使用客戶端的時間戳來決定一列的最新更新。當請求數據的時候,最新的時間戳贏,所以若是多個客戶端會話同時更新一行的相同列,最後更新的纔會被讀操做看到。htm
Cassandra 寫和刪除操做是徹底行level的隔離性。這意味着在單個節點上的一個分區,對客戶端來講一次只能寫入一行。這個操做範圍是嚴格受限的,直到他完成。在一個batch操做中的全部更新,屬於同一個給定的partition key有同樣的限制。然而,若是batch操做中包含超過一個分區的更新,並非隔離的。事務
Cassandra中的寫操做是持久化的。一個節點上的全部寫操做在收到應答標記寫入成功以前都會寫入到內存和磁盤的commit log中。若是在memtables flush到磁盤以前,突然宕機或者節點失敗,commit log 能夠用來在節點恢復重啓時找回丟失的寫入操做。除了本地的持久化(數據當即寫入到磁盤中),其餘節點上存有副本也加強了持久化。內存
能夠經過使用commitlog_sync選項來管理本地的持久化,知足對於一致性的需求。設置選項爲periodic 或者batchget