Cassandra不使用回滾和鎖機(jī)制來實(shí)現(xiàn)關(guān)系型數(shù)據(jù)的ACID事務(wù)惕蹄,而是提供最終(可調(diào)節(jié)的)一致性(consistancy)的atomic, isolated, and durable 事務(wù)嚣艇,讓用戶決定為每個(gè)事務(wù)提供強(qiáng)一致性或者最終一致性。
作為非關(guān)系型數(shù)據(jù)庫(kù)具钥,Cassandra不支持join或者外鍵,因此Cassandra不提供真正ACID層面的一致性。例如,當(dāng)從賬戶A轉(zhuǎn)賬給賬戶B翠霍,整個(gè)賬戶總額不應(yīng)該改變。Cassandra支持row-level的原子性和隔離性竟块,為了提供高可用和更快的寫入性能壶运,犧牲了transaction-level的原子性和隔離性。Cassandra寫操作是持久化的浪秘。
Atomicity
寫入操作在partition level滿足原子性,即同一partition的2行或者多行的寫入或者更新被當(dāng)做一次寫入操作(one write operation)埠况。刪除操作同樣是partition level耸携。
例如,如果寫一致性為QUORUM,relication factor為3辕翰,Cassandra會(huì)將寫操作復(fù)制到集群中的所有的節(jié)點(diǎn)夺衍,然后等待2個(gè)節(jié)點(diǎn)的應(yīng)答。如果某個(gè)節(jié)點(diǎn)寫入失敗了喜命,但是其他節(jié)點(diǎn)成功了沟沙,Cassandra會(huì)報(bào)告河劝,此次同步該節(jié)點(diǎn)失敗。然而矛紫,其他成功寫入的節(jié)點(diǎn)不會(huì)自動(dòng)進(jìn)行回滾赎瞎。
Cassandra使用客戶端的時(shí)間戳來決定一列的最新更新。當(dāng)請(qǐng)求數(shù)據(jù)的時(shí)候颊咬,最新的時(shí)間戳贏务甥,因此如果多個(gè)客戶端session同時(shí)更新一行的相同列,最后更新的才會(huì)被讀操作看到喳篇。
Isolation
寫入和刪除操作在row level滿足隔離性敞临。即對(duì)單個(gè)node上的單個(gè)partition的單行的寫入,只對(duì)此客戶端可見(對(duì)其他的客戶端是不可見的)麸澜。即在此次寫入操作完成前挺尿,它的scope是嚴(yán)格受限的。若一個(gè)batch操作的所有更新炊邦,都是屬于同一個(gè)partition key的编矾,那么此batch是滿足隔離性的。然而铣耘,如果batch操作涉及到一個(gè)以上partition的更新洽沟,并不是隔離的。
Durability
Cassandra中的寫操作是持久化的蜗细。一個(gè)節(jié)點(diǎn)上的所有寫操作裆操,在收到應(yīng)答標(biāo)記寫入成功之前,都會(huì)寫入到內(nèi)存和磁盤的commit log中炉媒。如果在memtables flush到磁盤之前踪区,忽然宕機(jī)了,在階段重啟恢復(fù)時(shí)吊骤,可以通過replay commit log 找回丟失的寫入操作缎岗。除了本地的持久化(數(shù)據(jù)立即寫入到磁盤中),其他節(jié)點(diǎn)上存有副本也增強(qiáng)了持久化白粉。
可以使用commitlog_sync參數(shù)來管理本地的持久化传泊,滿足對(duì)于一致性的需求。設(shè)置選項(xiàng)為periodic 或者batch鸭巴。